/*
 * Copyright (c) 2014 Google Inc.
 *
 * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
 * Public License v1.0 which accompanies this distribution, and is available at
 *
 * http://www.eclipse.org/legal/epl-v10.html
 */
package com.google.eclipse.protobuf;

import com.google.eclipse.protobuf.conversion.ProtobufTerminalConverters;
import com.google.eclipse.protobuf.linking.ProtobufResource;
import com.google.eclipse.protobuf.naming.ProtobufQualifiedNameConverter;
import com.google.eclipse.protobuf.naming.ProtobufQualifiedNameProvider;
import com.google.eclipse.protobuf.resource.FastXtextResourceSet;
import com.google.eclipse.protobuf.resource.GlobalResourceServiceProvider;
import com.google.eclipse.protobuf.scoping.ExtensionRegistryProvider;
import com.google.eclipse.protobuf.scoping.ProtobufCaseInsensitivityHelper;
import com.google.eclipse.protobuf.validation.ProtobufResourceValidator;
import com.google.eclipse.protobuf.validation.ProtobufSyntaxErrorMessageProvider;
import com.google.inject.Binder;

import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.xtext.conversion.IValueConverterService;
import org.eclipse.xtext.naming.IQualifiedNameConverter;
import org.eclipse.xtext.naming.IQualifiedNameProvider;
import org.eclipse.xtext.parser.antlr.ISyntaxErrorMessageProvider;
import org.eclipse.xtext.resource.IGlobalServiceProvider;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.resource.XtextResourceSet;
import org.eclipse.xtext.scoping.ICaseInsensitivityHelper;
import org.eclipse.xtext.validation.IResourceValidator;

/**
 * Use this class to register components to be used at runtime / without the Equinox extension
 * registry.
 */
public class ProtobufRuntimeModule extends AbstractProtobufRuntimeModule {
  public Class<? extends IGlobalServiceProvider> bindIGlobalServiceProvider() {
    return GlobalResourceServiceProvider.class;
  }

  public Class<? extends IQualifiedNameConverter> bindIQualifiedNameConverter() {
    return ProtobufQualifiedNameConverter.class;
  }

  public Class<? extends ICaseInsensitivityHelper> bindICaseInsensitivityHelper() {
    return ProtobufCaseInsensitivityHelper.class;
  }

  @Override
  public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
    return ProtobufQualifiedNameProvider.class;
  }

  public Class<? extends IResourceValidator> bindIResourceValidator() {
    return ProtobufResourceValidator.class;
  }

  public Class<? extends ISyntaxErrorMessageProvider> bindISyntaxErrorMessageProvider() {
    return ProtobufSyntaxErrorMessageProvider.class;
  }

  @Override
  public Class<? extends IValueConverterService> bindIValueConverterService() {
    return ProtobufTerminalConverters.class;
  }

  @Override
  public Class<? extends XtextResource> bindXtextResource() {
    return ProtobufResource.class;
  }

  @Override
  public Class<? extends XtextResourceSet> bindXtextResourceSet() {
    return FastXtextResourceSet.class;
  }

  public void configureExtensionRegistry(Binder binder) {
    binder.bind(IExtensionRegistry.class).toProvider(ExtensionRegistryProvider.class);
  }
}
