/**
 * Copyright (C) 2011 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.inject.internal;

import com.google.inject.Binding;
import com.google.inject.spi.UntargettedBinding;

/**
 * Processes just UntargettedBindings.
 *
 * @author sameb@google.com (Sam Berlin)
 */
class UntargettedBindingProcessor extends AbstractBindingProcessor {
  
  UntargettedBindingProcessor(Errors errors, ProcessedBindingData bindingData) {
    super(errors, bindingData);
  }
  
  @Override
  public <T> Boolean visit(Binding<T> binding) {
    return binding.acceptTargetVisitor(new Processor<T, Boolean>((BindingImpl<T>)binding) {  
      public Boolean visit(UntargettedBinding<? extends T> untargetted) {
        prepareBinding();

        // Error: Missing implementation.
        // Example: bind(Date.class).annotatedWith(Red.class);
        // We can't assume abstract types aren't injectable. They may have an
        // @ImplementedBy annotation or something.
        if (key.getAnnotationType() != null) {
          errors.missingImplementation(key);
          putBinding(invalidBinding(injector, key, source));
          return true;
        }
    
        // This cast is safe after the preceeding check.
        try {
          BindingImpl<T> binding = injector.createUninitializedBinding(
              key, scoping, source, errors, false);
          scheduleInitialization(binding);
          putBinding(binding);
        } catch (ErrorsException e) {
          errors.merge(e.getErrors());
          putBinding(invalidBinding(injector, key, source));
        }
    
        return true;
      }
      
      @Override
      protected Boolean visitOther(Binding<? extends T> binding) {
        return false;
      }
    });
  }
}
