langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Modules.java
changeset 38827 884d32899770
parent 38619 27c0007bb28d
child 39361 cd0aca7db174
equal deleted inserted replaced
38826:0e5f358c2155 38827:884d32899770
    66 import com.sun.tools.javac.code.Symbol.MethodSymbol;
    66 import com.sun.tools.javac.code.Symbol.MethodSymbol;
    67 import com.sun.tools.javac.code.Symbol.ModuleSymbol;
    67 import com.sun.tools.javac.code.Symbol.ModuleSymbol;
    68 import com.sun.tools.javac.code.Symbol.PackageSymbol;
    68 import com.sun.tools.javac.code.Symbol.PackageSymbol;
    69 import com.sun.tools.javac.code.Symtab;
    69 import com.sun.tools.javac.code.Symtab;
    70 import com.sun.tools.javac.code.Type;
    70 import com.sun.tools.javac.code.Type;
       
    71 import com.sun.tools.javac.code.Types;
    71 import com.sun.tools.javac.jvm.ClassWriter;
    72 import com.sun.tools.javac.jvm.ClassWriter;
    72 import com.sun.tools.javac.jvm.JNIWriter;
    73 import com.sun.tools.javac.jvm.JNIWriter;
    73 import com.sun.tools.javac.main.Option;
    74 import com.sun.tools.javac.main.Option;
    74 import com.sun.tools.javac.resources.CompilerProperties.Errors;
    75 import com.sun.tools.javac.resources.CompilerProperties.Errors;
    75 import com.sun.tools.javac.resources.CompilerProperties.Warnings;
    76 import com.sun.tools.javac.resources.CompilerProperties.Warnings;
   121     private final Log log;
   122     private final Log log;
   122     private final Names names;
   123     private final Names names;
   123     private final Symtab syms;
   124     private final Symtab syms;
   124     private final Attr attr;
   125     private final Attr attr;
   125     private final TypeEnvs typeEnvs;
   126     private final TypeEnvs typeEnvs;
       
   127     private final Types types;
   126     private final JavaFileManager fileManager;
   128     private final JavaFileManager fileManager;
   127     private final ModuleFinder moduleFinder;
   129     private final ModuleFinder moduleFinder;
   128     private final boolean allowModules;
   130     private final boolean allowModules;
   129 
   131 
   130     public final boolean multiModuleMode;
   132     public final boolean multiModuleMode;
   158         names = Names.instance(context);
   160         names = Names.instance(context);
   159         syms = Symtab.instance(context);
   161         syms = Symtab.instance(context);
   160         attr = Attr.instance(context);
   162         attr = Attr.instance(context);
   161         typeEnvs = TypeEnvs.instance(context);
   163         typeEnvs = TypeEnvs.instance(context);
   162         moduleFinder = ModuleFinder.instance(context);
   164         moduleFinder = ModuleFinder.instance(context);
       
   165         types = Types.instance(context);
   163         fileManager = context.get(JavaFileManager.class);
   166         fileManager = context.get(JavaFileManager.class);
   164         allowModules = Source.instance(context).allowModules();
   167         allowModules = Source.instance(context).allowModules();
   165         Options options = Options.instance(context);
   168         Options options = Options.instance(context);
   166 
   169 
   167         moduleOverride = options.get(Option.XMODULE);
   170         moduleOverride = options.get(Option.XMODULE);
   711         Map<Directive.ProvidesDirective, JCProvides> directiveToTreeMap = new HashMap<>();
   714         Map<Directive.ProvidesDirective, JCProvides> directiveToTreeMap = new HashMap<>();
   712 
   715 
   713         @Override
   716         @Override
   714         public void visitProvides(JCProvides tree) {
   717         public void visitProvides(JCProvides tree) {
   715             Type st = attr.attribType(tree.serviceName, env, syms.objectType);
   718             Type st = attr.attribType(tree.serviceName, env, syms.objectType);
   716             Type it = attr.attribType(tree.implName, env, st);
   719             Type it = attr.attribType(tree.implName, env, syms.objectType);
   717             ClassSymbol service = (ClassSymbol) st.tsym;
   720             ClassSymbol service = (ClassSymbol) st.tsym;
   718             ClassSymbol impl = (ClassSymbol) it.tsym;
   721             ClassSymbol impl = (ClassSymbol) it.tsym;
       
   722             if (!types.isSubtype(it, st)) {
       
   723                 log.error(tree.implName.pos(), Errors.ServiceImplementationMustBeSubtypeOfServiceInterface);
       
   724             }
   719             if ((impl.flags() & ABSTRACT) != 0) {
   725             if ((impl.flags() & ABSTRACT) != 0) {
   720                 log.error(tree.implName.pos(), Errors.ServiceImplementationIsAbstract(impl));
   726                 log.error(tree.implName.pos(), Errors.ServiceImplementationIsAbstract(impl));
   721             } else if (impl.isInner()) {
   727             } else if (impl.isInner()) {
   722                 log.error(tree.implName.pos(), Errors.ServiceImplementationIsInner(impl));
   728                 log.error(tree.implName.pos(), Errors.ServiceImplementationIsInner(impl));
   723             } else if (service.isInner()) {
   729             } else if (service.isInner()) {