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()) { |