Partial compilation of package (only functions supported).

This commit is contained in:
Evgeny Gerashchenko
2014-01-28 22:56:16 +04:00
parent 00c2bd60e5
commit d62bc07437
29 changed files with 393 additions and 83 deletions
@@ -16,6 +16,8 @@
package org.jetbrains.jet.codegen; package org.jetbrains.jet.codegen;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtil;
@@ -27,23 +29,32 @@ import com.intellij.util.SmartList;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.asm4.AnnotationVisitor; import org.jetbrains.asm4.AnnotationVisitor;
import org.jetbrains.asm4.MethodVisitor;
import org.jetbrains.asm4.Type; import org.jetbrains.asm4.Type;
import org.jetbrains.jet.codegen.context.CodegenContext; import org.jetbrains.jet.codegen.context.CodegenContext;
import org.jetbrains.jet.codegen.context.FieldOwnerContext; import org.jetbrains.jet.codegen.context.FieldOwnerContext;
import org.jetbrains.jet.codegen.context.MethodContext;
import org.jetbrains.jet.codegen.signature.JvmMethodSignature;
import org.jetbrains.jet.codegen.context.PackageContext; import org.jetbrains.jet.codegen.context.PackageContext;
import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.descriptors.serialization.*;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedSimpleFunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
import org.jetbrains.jet.codegen.state.GenerationStateAware; import org.jetbrains.jet.codegen.state.GenerationStateAware;
import org.jetbrains.jet.descriptors.serialization.BitEncoding; import org.jetbrains.jet.descriptors.serialization.BitEncoding;
import org.jetbrains.jet.descriptors.serialization.DescriptorSerializer; import org.jetbrains.jet.descriptors.serialization.DescriptorSerializer;
import org.jetbrains.jet.descriptors.serialization.PackageData; import org.jetbrains.jet.descriptors.serialization.PackageData;
import org.jetbrains.jet.descriptors.serialization.ProtoBuf; import org.jetbrains.jet.descriptors.serialization.ProtoBuf;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.MemberComparator;
import org.jetbrains.jet.lang.resolve.java.JvmAbi; import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames; import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames;
import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.java.lazy.descriptors.LazyJavaPackageFragmentScope;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
@@ -52,6 +63,7 @@ import java.util.*;
import static org.jetbrains.asm4.Opcodes.*; import static org.jetbrains.asm4.Opcodes.*;
import static org.jetbrains.jet.codegen.AsmUtil.asmDescByFqNameWithoutInnerClasses; import static org.jetbrains.jet.codegen.AsmUtil.asmDescByFqNameWithoutInnerClasses;
import static org.jetbrains.jet.codegen.AsmUtil.asmTypeByFqNameWithoutInnerClasses; import static org.jetbrains.jet.codegen.AsmUtil.asmTypeByFqNameWithoutInnerClasses;
import static org.jetbrains.jet.codegen.JvmSerializationBindings.METHOD_FOR_FUNCTION;
import static org.jetbrains.jet.descriptors.serialization.NameSerializationUtil.createNameResolver; import static org.jetbrains.jet.descriptors.serialization.NameSerializationUtil.createNameResolver;
import static org.jetbrains.jet.lang.resolve.java.PackageClassUtils.getPackageClassFqName; import static org.jetbrains.jet.lang.resolve.java.PackageClassUtils.getPackageClassFqName;
@@ -62,6 +74,7 @@ public class PackageCodegen extends GenerationStateAware {
@NotNull @NotNull
private final Collection<JetFile> files; private final Collection<JetFile> files;
private final PackageFragmentDescriptor packageFragment; private final PackageFragmentDescriptor packageFragment;
private final PackageFragmentDescriptor compiledPackageFragment;
public PackageCodegen( public PackageCodegen(
@NotNull ClassBuilderOnDemand v, @NotNull ClassBuilderOnDemand v,
@@ -74,8 +87,10 @@ public class PackageCodegen extends GenerationStateAware {
this.v = v; this.v = v;
this.files = packageFiles; this.files = packageFiles;
this.packageFragment = getOnlyPackageFragment(); this.packageFragment = getOnlyPackageFragment();
this.compiledPackageFragment = getCompiledPackageFragment();
final PsiFile sourceFile = packageFiles.size() == 1 ? packageFiles.iterator().next().getContainingFile() : null; final PsiFile sourceFile = packageFiles.size() == 1 && getAlreadyCompiledCallables().isEmpty()
? packageFiles.iterator().next().getContainingFile() : null;
v.addOptionalDeclaration(new ClassBuilderOnDemand.ClassBuilderCallback() { v.addOptionalDeclaration(new ClassBuilderOnDemand.ClassBuilderCallback() {
@Override @Override
@@ -95,6 +110,69 @@ public class PackageCodegen extends GenerationStateAware {
}); });
} }
@Nullable
private PackageFragmentDescriptor getCompiledPackageFragment() {
// TODO rewrite it to something more robust when module system is implemented
for (PackageFragmentDescriptor anotherFragment : packageFragment.getContainingDeclaration().getPackageFragmentProvider()
.getPackageFragments(packageFragment.getFqName())) {
if (anotherFragment.getMemberScope() instanceof LazyJavaPackageFragmentScope) {
return anotherFragment;
}
}
return null;
}
@NotNull
private List<CallableMemberDescriptor> getAlreadyCompiledCallables() {
List<CallableMemberDescriptor> callables = Lists.newArrayList();
if (compiledPackageFragment != null) {
for (DeclarationDescriptor member : compiledPackageFragment.getMemberScope().getAllDescriptors()) {
if (member instanceof DeserializedSimpleFunctionDescriptor) {
callables.add((DeserializedSimpleFunctionDescriptor) member);
}
}
}
return callables;
}
private void generateDelegationsToAlreadyCompiled(Map<CallableMemberDescriptor, Runnable> generateCallableMemberTasks) {
for (final CallableMemberDescriptor member : getAlreadyCompiledCallables()) {
generateCallableMemberTasks.put(member, new Runnable() {
@Override
public void run() {
DeserializedSimpleFunctionDescriptor deserializedFunction = (DeserializedSimpleFunctionDescriptor) member;
FieldOwnerContext context = CodegenContext.STATIC.intoPackageFacade(
Type.getObjectType(getPackagePartInternalName(deserializedFunction)),
compiledPackageFragment);
FunctionCodegen fuCo = new FunctionCodegen(
context,
v.getClassBuilder(),
state,
getMemberCodegen(context)
);
JvmMethodSignature signature = typeMapper.mapSignature(deserializedFunction, OwnerKind.PACKAGE);
fuCo.generateMethod(null, signature, deserializedFunction,
new FunctionGenerationStrategy() {
@Override
public void generateBody(
@NotNull MethodVisitor mv,
@NotNull JvmMethodSignature signature,
@NotNull MethodContext context,
@Nullable MemberCodegen parentCodegen
) {
throw new IllegalStateException("shouldn't be called");
}
});
v.getClassBuilder().getSerializationBindings().put(METHOD_FOR_FUNCTION, deserializedFunction, signature.getAsmMethod());
}
});
}
}
public void generate(@NotNull CompilationErrorHandler errorHandler) { public void generate(@NotNull CompilationErrorHandler errorHandler) {
List<JvmSerializationBindings> bindings = new ArrayList<JvmSerializationBindings>(files.size() + 1); List<JvmSerializationBindings> bindings = new ArrayList<JvmSerializationBindings>(files.size() + 1);
boolean shouldGeneratePackageClass = shouldGeneratePackageClass(files); boolean shouldGeneratePackageClass = shouldGeneratePackageClass(files);
@@ -102,9 +180,11 @@ public class PackageCodegen extends GenerationStateAware {
bindings.add(v.getClassBuilder().getSerializationBindings()); bindings.add(v.getClassBuilder().getSerializationBindings());
} }
Map<CallableMemberDescriptor, Runnable> generateCallableMemberTasks = new HashMap<CallableMemberDescriptor, Runnable>();
for (JetFile file : files) { for (JetFile file : files) {
try { try {
ClassBuilder builder = generate(file); ClassBuilder builder = generate(file, generateCallableMemberTasks);
if (builder != null) { if (builder != null) {
bindings.add(builder.getSerializationBindings()); bindings.add(builder.getSerializationBindings());
} }
@@ -123,6 +203,15 @@ public class PackageCodegen extends GenerationStateAware {
} }
} }
if (shouldGeneratePackageClass) {
// Shouldn't generate delegations to previously compiled if we compile only "classes" part of a package.
generateDelegationsToAlreadyCompiled(generateCallableMemberTasks);
}
for (CallableMemberDescriptor member : Ordering.from(MemberComparator.INSTANCE).sortedCopy(generateCallableMemberTasks.keySet())) {
generateCallableMemberTasks.get(member).run();
}
if (shouldGeneratePackageClass) { if (shouldGeneratePackageClass) {
writeKotlinPackageAnnotationIfNeeded(JvmSerializationBindings.union(bindings)); writeKotlinPackageAnnotationIfNeeded(JvmSerializationBindings.union(bindings));
} }
@@ -142,7 +231,10 @@ public class PackageCodegen extends GenerationStateAware {
} }
DescriptorSerializer serializer = new DescriptorSerializer(new JavaSerializerExtension(bindings)); DescriptorSerializer serializer = new DescriptorSerializer(new JavaSerializerExtension(bindings));
ProtoBuf.Package packageProto = serializer.packageProto(Collections.singleton(packageFragment)).build(); Collection<PackageFragmentDescriptor> packageFragments = compiledPackageFragment == null
? Collections.singleton(packageFragment)
: Arrays.asList(packageFragment, compiledPackageFragment);
ProtoBuf.Package packageProto = serializer.packageProto(packageFragments).build();
if (packageProto.getMemberCount() == 0) return; if (packageProto.getMemberCount() == 0) return;
@@ -160,7 +252,7 @@ public class PackageCodegen extends GenerationStateAware {
} }
@Nullable @Nullable
private ClassBuilder generate(@NotNull JetFile file) { private ClassBuilder generate(@NotNull JetFile file, @NotNull Map<CallableMemberDescriptor, Runnable> generateCallableMemberTasks) {
boolean generateSrcClass = false; boolean generateSrcClass = false;
Type packagePartType = getPackagePartType(getPackageClassFqName(packageFragment.getFqName()), file.getVirtualFile()); Type packagePartType = getPackagePartType(getPackageClassFqName(packageFragment.getFqName()), file.getVirtualFile());
PackageContext packagePartContext = CodegenContext.STATIC.intoPackagePart(packageFragment, packagePartType); PackageContext packagePartContext = CodegenContext.STATIC.intoPackagePart(packageFragment, packagePartType);
@@ -187,22 +279,40 @@ public class PackageCodegen extends GenerationStateAware {
new PackagePartCodegen(builder, file, packagePartType, packagePartContext, state).generate(); new PackagePartCodegen(builder, file, packagePartType, packagePartContext, state).generate();
FieldOwnerContext packageFacade = CodegenContext.STATIC.intoPackageFacade(packagePartType, packageFragment); final FieldOwnerContext packageFacade = CodegenContext.STATIC.intoPackageFacade(packagePartType, packageFragment);
//TODO: FIX: Default method generated at facade without delegation
MemberCodegen memberCodegen = new MemberCodegen(state, null, packageFacade, null) { final MemberCodegen memberCodegen = getMemberCodegen(packageFacade);
for (final JetDeclaration declaration : file.getDeclarations()) {
if (declaration instanceof JetNamedFunction || declaration instanceof JetProperty) {
DeclarationDescriptor descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration);
assert descriptor instanceof CallableMemberDescriptor :
"Expected callable member, was " + descriptor + " for " + declaration.getText();
generateCallableMemberTasks.put(
(CallableMemberDescriptor) descriptor,
new Runnable() {
@Override
public void run() {
memberCodegen.genFunctionOrProperty(
packageFacade, (JetTypeParameterListOwner) declaration, v.getClassBuilder());
}
}
);
}
}
return builder;
}
//TODO: FIX: Default method generated at facade without delegation
private MemberCodegen getMemberCodegen(@NotNull FieldOwnerContext packageFacade) {
return new MemberCodegen(state, null, packageFacade, null) {
@NotNull @NotNull
@Override @Override
public ClassBuilder getBuilder() { public ClassBuilder getBuilder() {
return v.getClassBuilder(); return v.getClassBuilder();
} }
}; };
for (JetDeclaration declaration : file.getDeclarations()) {
if (declaration instanceof JetNamedFunction || declaration instanceof JetProperty) {
memberCodegen.genFunctionOrProperty(packageFacade, (JetTypeParameterListOwner) declaration, v.getClassBuilder());
}
}
return builder;
} }
@NotNull @NotNull
@@ -257,9 +367,11 @@ public class PackageCodegen extends GenerationStateAware {
String srcName = facadeFqName.shortName().asString() + "-" + replaceSpecialSymbols(fileName) + "-" + Integer.toHexString( String srcName = facadeFqName.shortName().asString() + "-" + replaceSpecialSymbols(fileName) + "-" + Integer.toHexString(
CodegenUtil.getPathHashCode(file)); CodegenUtil.getPathHashCode(file));
FqName srcFqName = facadeFqName.parent().child(Name.identifier(srcName)); return getPackagePartType(facadeFqName, Name.identifier(srcName));
}
return asmTypeByFqNameWithoutInnerClasses(srcFqName); public static Type getPackagePartType(FqName facadeFqName, Name packagePartName) {
return asmTypeByFqNameWithoutInnerClasses(facadeFqName.parent().child(packagePartName));
} }
@NotNull @NotNull
@@ -272,4 +384,17 @@ public class PackageCodegen extends GenerationStateAware {
FqName packageFqName = file.getPackageFqName(); FqName packageFqName = file.getPackageFqName();
return getPackagePartType(getPackageClassFqName(packageFqName), file.getVirtualFile()).getInternalName(); return getPackagePartType(getPackageClassFqName(packageFqName), file.getVirtualFile()).getInternalName();
} }
@NotNull
public static String getPackagePartInternalName(@NotNull DeserializedSimpleFunctionDescriptor deserializedFunction) {
DeclarationDescriptor parent = deserializedFunction.getContainingDeclaration();
assert parent instanceof PackageFragmentDescriptor : "parent should be package, but was: " + parent;
assert deserializedFunction.getFunctionProto().hasExtension(JavaProtoBuf.implClassName)
: "implClassName extension is absent for " + deserializedFunction;
Name shortName = deserializedFunction.getNameResolver()
.getName(deserializedFunction.getFunctionProto().getExtension(JavaProtoBuf.implClassName));
FqName packagePartFqName = ((PackageFragmentDescriptor) parent).getFqName().child(shortName);
return JvmClassName.byFqNameWithoutInnerClasses(packagePartFqName).getInternalName();
}
} }
@@ -29,6 +29,7 @@ import org.jetbrains.jet.codegen.signature.BothSignatureWriter;
import org.jetbrains.jet.codegen.signature.JvmMethodParameterKind; import org.jetbrains.jet.codegen.signature.JvmMethodParameterKind;
import org.jetbrains.jet.codegen.signature.JvmMethodParameterSignature; import org.jetbrains.jet.codegen.signature.JvmMethodParameterSignature;
import org.jetbrains.jet.codegen.signature.JvmMethodSignature; import org.jetbrains.jet.codegen.signature.JvmMethodSignature;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedSimpleFunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.impl.AnonymousFunctionDescriptor; import org.jetbrains.jet.lang.descriptors.impl.AnonymousFunctionDescriptor;
import org.jetbrains.jet.lang.psi.JetDelegatorToSuperCall; import org.jetbrains.jet.lang.psi.JetDelegatorToSuperCall;
@@ -126,13 +127,16 @@ public class JetTypeMapper extends BindingTraceAware {
} }
// It's not a package created for Java class statics // It's not a package created for Java class statics
JetFile file = BindingContextUtils.getContainingFile(bindingContext, descriptor); if (insideModule) {
if (insideModule && file != null) { JetFile file = BindingContextUtils.getContainingFile(bindingContext, descriptor);
return PackageCodegen.getPackagePartInternalName(file); if (file != null) {
} return PackageCodegen.getPackagePartInternalName(file);
else { }
return PackageClassUtils.getPackageClassFqName(packageFragment.getFqName()).asString().replace('.', '/'); if (descriptor instanceof DeserializedSimpleFunctionDescriptor) {
return PackageCodegen.getPackagePartInternalName((DeserializedSimpleFunctionDescriptor) descriptor);
}
} }
return PackageClassUtils.getPackageClassFqName(packageFragment.getFqName()).asString().replace('.', '/');
} }
@NotNull @NotNull
+2
View File
@@ -18,6 +18,8 @@
<orderEntry type="module" module-name="descriptor.loader.java" /> <orderEntry type="module" module-name="descriptor.loader.java" />
<orderEntry type="module" module-name="util" /> <orderEntry type="module" module-name="util" />
<orderEntry type="module" module-name="backend-common" /> <orderEntry type="module" module-name="backend-common" />
<orderEntry type="module" module-name="serialization" />
<orderEntry type="module" module-name="serialization.java" />
</component> </component>
</module> </module>
@@ -0,0 +1,39 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* 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 org.jetbrains.jet.cli.jvm.compiler
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter
import org.jetbrains.jet.descriptors.serialization.ProtoBuf
import org.jetbrains.jet.codegen.PackageCodegen.getPackagePartInternalName
import org.jetbrains.jet.descriptors.serialization.NameResolver
import org.jetbrains.jet.descriptors.serialization.JavaProtoBuf
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor
import org.jetbrains.jet.lang.resolve.java.JvmClassName
public class CliSourcesMemberFilter(environment: JetCoreEnvironment): MemberFilter {
val packagePartClassNames = environment.getSourceFiles().map { getPackagePartInternalName(it) }.toSet()
override fun acceptPackagePartClass(container: PackageFragmentDescriptor, member: ProtoBuf.Callable, nameResolver: NameResolver): Boolean {
if (member.hasExtension(JavaProtoBuf.implClassName)) {
val shortName = nameResolver.getName(member.getExtension(JavaProtoBuf.implClassName)!!)
val fqName = container.getFqName().child(shortName)
val internalName = JvmClassName.byFqNameWithoutInnerClasses(fqName).getInternalName()
return internalName !in packagePartClassNames
}
return true
}
}
@@ -301,6 +301,7 @@ public class JetCoreEnvironment {
} }
} }
@NotNull
public List<JetFile> getSourceFiles() { public List<JetFile> getSourceFiles() {
return sourceFiles; return sourceFiles;
} }
@@ -275,8 +275,8 @@ public class KotlinToJVMBytecodeCompiler {
environment.getConfiguration().getList(JVMConfigurationKeys.SCRIPT_PARAMETERS), environment.getConfiguration().getList(JVMConfigurationKeys.SCRIPT_PARAMETERS),
Predicates.<PsiFile>alwaysTrue(), Predicates.<PsiFile>alwaysTrue(),
false, false,
sharedModule sharedModule,
); new CliSourcesMemberFilter(environment));
} }
}, environment.getSourceFiles() }, environment.getSourceFiles()
); );
@@ -43,6 +43,7 @@ import org.jetbrains.jet.codegen.CompilationErrorHandler;
import org.jetbrains.jet.codegen.KotlinCodegenFacade; import org.jetbrains.jet.codegen.KotlinCodegenFacade;
import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.config.CompilerConfiguration; import org.jetbrains.jet.config.CompilerConfiguration;
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter;
import org.jetbrains.jet.di.InjectorForTopDownAnalyzerForJvm; import org.jetbrains.jet.di.InjectorForTopDownAnalyzerForJvm;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl; import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.ScriptDescriptor; import org.jetbrains.jet.lang.descriptors.ScriptDescriptor;
@@ -75,9 +76,7 @@ import java.util.List;
import static org.jetbrains.jet.codegen.AsmUtil.asmTypeByFqNameWithoutInnerClasses; import static org.jetbrains.jet.codegen.AsmUtil.asmTypeByFqNameWithoutInnerClasses;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.registerClassNameForScript; import static org.jetbrains.jet.codegen.binding.CodegenBinding.registerClassNameForScript;
import static org.jetbrains.jet.lang.descriptors.DependencyKind.BINARIES; import static org.jetbrains.jet.lang.descriptors.DependencyKind.*;
import static org.jetbrains.jet.lang.descriptors.DependencyKind.BUILT_INS;
import static org.jetbrains.jet.lang.descriptors.DependencyKind.SOURCES;
public class ReplInterpreter { public class ReplInterpreter {
@@ -111,7 +110,7 @@ public class ReplInterpreter {
false, false,
true, true,
Collections.<AnalyzerScriptParameter>emptyList()); Collections.<AnalyzerScriptParameter>emptyList());
injector = new InjectorForTopDownAnalyzerForJvm(project, topDownAnalysisParameters, trace, module); injector = new InjectorForTopDownAnalyzerForJvm(project, topDownAnalysisParameters, trace, module, MemberFilter.ALWAYS_TRUE);
topDownAnalysisContext = new TopDownAnalysisContext(topDownAnalysisParameters); topDownAnalysisContext = new TopDownAnalysisContext(topDownAnalysisParameters);
module.addFragmentProvider(SOURCES, injector.getTopDownAnalyzer().getPackageFragmentProvider()); module.addFragmentProvider(SOURCES, injector.getTopDownAnalyzer().getPackageFragmentProvider());
module.addFragmentProvider(BUILT_INS, KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider()); module.addFragmentProvider(BUILT_INS, KotlinBuiltIns.getInstance().getBuiltInsModule().getPackageFragmentProvider());
@@ -29,6 +29,7 @@ import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedErrorReporter;
import org.jetbrains.jet.lang.resolve.java.resolver.PsiBasedMethodSignatureChecker; import org.jetbrains.jet.lang.resolve.java.resolver.PsiBasedMethodSignatureChecker;
import org.jetbrains.jet.lang.resolve.java.resolver.PsiBasedExternalAnnotationResolver; import org.jetbrains.jet.lang.resolve.java.resolver.PsiBasedExternalAnnotationResolver;
import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder; import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder;
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter;
import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider; import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider;
import org.jetbrains.jet.lang.resolve.java.lazy.GlobalJavaResolverContext; import org.jetbrains.jet.lang.resolve.java.lazy.GlobalJavaResolverContext;
import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver; import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver;
@@ -56,6 +57,7 @@ public class InjectorForJavaDescriptorResolver {
private final PsiBasedMethodSignatureChecker psiBasedMethodSignatureChecker; private final PsiBasedMethodSignatureChecker psiBasedMethodSignatureChecker;
private final PsiBasedExternalAnnotationResolver psiBasedExternalAnnotationResolver; private final PsiBasedExternalAnnotationResolver psiBasedExternalAnnotationResolver;
private final VirtualFileFinder virtualFileFinder; private final VirtualFileFinder virtualFileFinder;
private final MemberFilter memberFilter;
private final LazyJavaPackageFragmentProvider lazyJavaPackageFragmentProvider; private final LazyJavaPackageFragmentProvider lazyJavaPackageFragmentProvider;
private final GlobalJavaResolverContext globalJavaResolverContext; private final GlobalJavaResolverContext globalJavaResolverContext;
private final DeserializedDescriptorResolver deserializedDescriptorResolver; private final DeserializedDescriptorResolver deserializedDescriptorResolver;
@@ -84,6 +86,7 @@ public class InjectorForJavaDescriptorResolver {
this.globalJavaResolverContext = new GlobalJavaResolverContext(lockBasedStorageManager, getJavaClassFinder(), virtualFileFinder, deserializedDescriptorResolver, psiBasedExternalAnnotationResolver, traceBasedExternalSignatureResolver, traceBasedErrorReporter, psiBasedMethodSignatureChecker, traceBasedJavaResolverCache); this.globalJavaResolverContext = new GlobalJavaResolverContext(lockBasedStorageManager, getJavaClassFinder(), virtualFileFinder, deserializedDescriptorResolver, psiBasedExternalAnnotationResolver, traceBasedExternalSignatureResolver, traceBasedErrorReporter, psiBasedMethodSignatureChecker, traceBasedJavaResolverCache);
this.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, getModule()); this.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, getModule());
this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, getModule()); this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, getModule());
this.memberFilter = org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter.ALWAYS_TRUE;
this.descriptorDeserializers = new DescriptorDeserializers(); this.descriptorDeserializers = new DescriptorDeserializers();
this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer(); this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer();
this.descriptorDeserializersStorage = new DescriptorDeserializersStorage(lockBasedStorageManager); this.descriptorDeserializersStorage = new DescriptorDeserializersStorage(lockBasedStorageManager);
@@ -105,6 +108,7 @@ public class InjectorForJavaDescriptorResolver {
deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter); deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter);
deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver); deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver);
deserializedDescriptorResolver.setJavaPackageFragmentProvider(lazyJavaPackageFragmentProvider); deserializedDescriptorResolver.setJavaPackageFragmentProvider(lazyJavaPackageFragmentProvider);
deserializedDescriptorResolver.setMemberFilter(memberFilter);
deserializedDescriptorResolver.setStorageManager(lockBasedStorageManager); deserializedDescriptorResolver.setStorageManager(lockBasedStorageManager);
descriptorDeserializers.setAnnotationDescriptorDeserializer(annotationDescriptorDeserializer); descriptorDeserializers.setAnnotationDescriptorDeserializer(annotationDescriptorDeserializer);
@@ -26,6 +26,7 @@ import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder; import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder;
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter;
import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl; import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl;
import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedExternalSignatureResolver; import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedExternalSignatureResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.LazyResolveBasedCache; import org.jetbrains.jet.lang.resolve.java.resolver.LazyResolveBasedCache;
@@ -73,6 +74,7 @@ public class InjectorForLazyResolveWithJava {
private final ResolveSession resolveSession; private final ResolveSession resolveSession;
private final JavaDescriptorResolver javaDescriptorResolver; private final JavaDescriptorResolver javaDescriptorResolver;
private final VirtualFileFinder virtualFileFinder; private final VirtualFileFinder virtualFileFinder;
private final MemberFilter memberFilter;
private final JavaClassFinderImpl javaClassFinder; private final JavaClassFinderImpl javaClassFinder;
private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver; private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver;
private final LazyResolveBasedCache lazyResolveBasedCache; private final LazyResolveBasedCache lazyResolveBasedCache;
@@ -129,6 +131,7 @@ public class InjectorForLazyResolveWithJava {
this.globalJavaResolverContext = new GlobalJavaResolverContext(lockBasedStorageManager, javaClassFinder, virtualFileFinder, deserializedDescriptorResolver, psiBasedExternalAnnotationResolver, traceBasedExternalSignatureResolver, traceBasedErrorReporter, psiBasedMethodSignatureChecker, lazyResolveBasedCache); this.globalJavaResolverContext = new GlobalJavaResolverContext(lockBasedStorageManager, javaClassFinder, virtualFileFinder, deserializedDescriptorResolver, psiBasedExternalAnnotationResolver, traceBasedExternalSignatureResolver, traceBasedErrorReporter, psiBasedMethodSignatureChecker, lazyResolveBasedCache);
this.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, getModule()); this.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, getModule());
this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, getModule()); this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, getModule());
this.memberFilter = org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter.ALWAYS_TRUE;
this.annotationResolver = new AnnotationResolver(); this.annotationResolver = new AnnotationResolver();
this.callResolver = new CallResolver(); this.callResolver = new CallResolver();
this.argumentTypeResolver = new ArgumentTypeResolver(); this.argumentTypeResolver = new ArgumentTypeResolver();
@@ -224,6 +227,7 @@ public class InjectorForLazyResolveWithJava {
deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter); deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter);
deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver); deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver);
deserializedDescriptorResolver.setJavaPackageFragmentProvider(lazyJavaPackageFragmentProvider); deserializedDescriptorResolver.setJavaPackageFragmentProvider(lazyJavaPackageFragmentProvider);
deserializedDescriptorResolver.setMemberFilter(memberFilter);
deserializedDescriptorResolver.setStorageManager(lockBasedStorageManager); deserializedDescriptorResolver.setStorageManager(lockBasedStorageManager);
descriptorDeserializers.setAnnotationDescriptorDeserializer(annotationDescriptorDeserializer); descriptorDeserializers.setAnnotationDescriptorDeserializer(annotationDescriptorDeserializer);
@@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.descriptors.ModuleDescriptorImpl;
import org.jetbrains.jet.lang.PlatformToKotlinClassMap; import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
import org.jetbrains.jet.lang.resolve.TopDownAnalyzer; import org.jetbrains.jet.lang.resolve.TopDownAnalyzer;
import org.jetbrains.jet.lang.resolve.MutablePackageFragmentProvider; import org.jetbrains.jet.lang.resolve.MutablePackageFragmentProvider;
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl; import org.jetbrains.jet.lang.resolve.java.JavaClassFinderImpl;
import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedExternalSignatureResolver; import org.jetbrains.jet.lang.resolve.java.resolver.TraceBasedExternalSignatureResolver;
@@ -81,6 +82,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
private final PlatformToKotlinClassMap platformToKotlinClassMap; private final PlatformToKotlinClassMap platformToKotlinClassMap;
private final TopDownAnalyzer topDownAnalyzer; private final TopDownAnalyzer topDownAnalyzer;
private final MutablePackageFragmentProvider mutablePackageFragmentProvider; private final MutablePackageFragmentProvider mutablePackageFragmentProvider;
private final MemberFilter memberFilter;
private final JavaDescriptorResolver javaDescriptorResolver; private final JavaDescriptorResolver javaDescriptorResolver;
private final JavaClassFinderImpl javaClassFinder; private final JavaClassFinderImpl javaClassFinder;
private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver; private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver;
@@ -128,7 +130,8 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
@NotNull Project project, @NotNull Project project,
@NotNull GlobalContext globalContext, @NotNull GlobalContext globalContext,
@NotNull BindingTrace bindingTrace, @NotNull BindingTrace bindingTrace,
@NotNull ModuleDescriptorImpl moduleDescriptor @NotNull ModuleDescriptorImpl moduleDescriptor,
@NotNull MemberFilter memberFilter
) { ) {
this.project = project; this.project = project;
this.globalContext = globalContext; this.globalContext = globalContext;
@@ -138,6 +141,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
this.platformToKotlinClassMap = moduleDescriptor.getPlatformToKotlinClassMap(); this.platformToKotlinClassMap = moduleDescriptor.getPlatformToKotlinClassMap();
this.topDownAnalyzer = new TopDownAnalyzer(); this.topDownAnalyzer = new TopDownAnalyzer();
this.mutablePackageFragmentProvider = new MutablePackageFragmentProvider(getModuleDescriptor()); this.mutablePackageFragmentProvider = new MutablePackageFragmentProvider(getModuleDescriptor());
this.memberFilter = memberFilter;
this.javaClassFinder = new JavaClassFinderImpl(); this.javaClassFinder = new JavaClassFinderImpl();
this.virtualFileFinder = org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder.SERVICE.getInstance(project); this.virtualFileFinder = org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder.SERVICE.getInstance(project);
this.deserializedDescriptorResolver = new DeserializedDescriptorResolver(); this.deserializedDescriptorResolver = new DeserializedDescriptorResolver();
@@ -302,6 +306,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter); deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter);
deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver); deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver);
deserializedDescriptorResolver.setJavaPackageFragmentProvider(lazyJavaPackageFragmentProvider); deserializedDescriptorResolver.setJavaPackageFragmentProvider(lazyJavaPackageFragmentProvider);
deserializedDescriptorResolver.setMemberFilter(memberFilter);
deserializedDescriptorResolver.setStorageManager(storageManager); deserializedDescriptorResolver.setStorageManager(storageManager);
descriptorDeserializers.setAnnotationDescriptorDeserializer(annotationDescriptorDeserializer); descriptorDeserializers.setAnnotationDescriptorDeserializer(annotationDescriptorDeserializer);
@@ -28,6 +28,7 @@ import org.jetbrains.jet.analyzer.AnalyzerFacadeForEverything;
import org.jetbrains.jet.context.ContextPackage; import org.jetbrains.jet.context.ContextPackage;
import org.jetbrains.jet.context.GlobalContext; import org.jetbrains.jet.context.GlobalContext;
import org.jetbrains.jet.context.GlobalContextImpl; import org.jetbrains.jet.context.GlobalContextImpl;
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter;
import org.jetbrains.jet.di.InjectorForLazyResolveWithJava; import org.jetbrains.jet.di.InjectorForLazyResolveWithJava;
import org.jetbrains.jet.di.InjectorForTopDownAnalyzerForJvm; import org.jetbrains.jet.di.InjectorForTopDownAnalyzerForJvm;
import org.jetbrains.jet.lang.descriptors.DependencyKind; import org.jetbrains.jet.lang.descriptors.DependencyKind;
@@ -195,7 +196,7 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
boolean storeContextForBodiesResolve boolean storeContextForBodiesResolve
) { ) {
return analyzeFilesWithJavaIntegration(project, files, trace, scriptParameters, filesToAnalyzeCompletely, return analyzeFilesWithJavaIntegration(project, files, trace, scriptParameters, filesToAnalyzeCompletely,
storeContextForBodiesResolve, createJavaModule("<module>")); storeContextForBodiesResolve, createJavaModule("<module>"), MemberFilter.ALWAYS_TRUE);
} }
@NotNull @NotNull
@@ -206,11 +207,12 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
List<AnalyzerScriptParameter> scriptParameters, List<AnalyzerScriptParameter> scriptParameters,
Predicate<PsiFile> filesToAnalyzeCompletely, Predicate<PsiFile> filesToAnalyzeCompletely,
boolean storeContextForBodiesResolve, boolean storeContextForBodiesResolve,
ModuleDescriptorImpl module ModuleDescriptorImpl module,
MemberFilter memberFilter
) { ) {
GlobalContext globalContext = ContextPackage.GlobalContext(); GlobalContext globalContext = ContextPackage.GlobalContext();
return analyzeFilesWithJavaIntegrationInGlobalContext(project, files, trace, scriptParameters, filesToAnalyzeCompletely, return analyzeFilesWithJavaIntegrationInGlobalContext(project, files, trace, scriptParameters, filesToAnalyzeCompletely,
storeContextForBodiesResolve, module, globalContext); storeContextForBodiesResolve, module, globalContext, memberFilter);
} }
@NotNull @NotNull
@@ -222,7 +224,8 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
Predicate<PsiFile> filesToAnalyzeCompletely, Predicate<PsiFile> filesToAnalyzeCompletely,
boolean storeContextForBodiesResolve, boolean storeContextForBodiesResolve,
ModuleDescriptorImpl module, ModuleDescriptorImpl module,
GlobalContext globalContext GlobalContext globalContext,
MemberFilter memberFilter
) { ) {
TopDownAnalysisParameters topDownAnalysisParameters = new TopDownAnalysisParameters( TopDownAnalysisParameters topDownAnalysisParameters = new TopDownAnalysisParameters(
globalContext.getStorageManager(), globalContext.getStorageManager(),
@@ -233,7 +236,8 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
scriptParameters scriptParameters
); );
InjectorForTopDownAnalyzerForJvm injector = new InjectorForTopDownAnalyzerForJvm(project, topDownAnalysisParameters, trace, module); InjectorForTopDownAnalyzerForJvm injector = new InjectorForTopDownAnalyzerForJvm(project, topDownAnalysisParameters, trace, module,
memberFilter);
try { try {
module.addFragmentProvider(DependencyKind.BINARIES, injector.getJavaDescriptorResolver().getPackageFragmentProvider()); module.addFragmentProvider(DependencyKind.BINARIES, injector.getJavaDescriptorResolver().getPackageFragmentProvider());
TopDownAnalysisContext topDownAnalysisContext = injector.getTopDownAnalyzer().analyzeFiles(topDownAnalysisParameters, files); TopDownAnalysisContext topDownAnalysisContext = injector.getTopDownAnalyzer().analyzeFiles(topDownAnalysisParameters, files);
@@ -60,11 +60,11 @@ public abstract class DeserializedMemberScope implements JetScope {
private final MemoizedFunctionToNotNull<Name, Collection<VariableDescriptor>> properties; private final MemoizedFunctionToNotNull<Name, Collection<VariableDescriptor>> properties;
private final NotNullLazyValue<Collection<DeclarationDescriptor>> allDescriptors; private final NotNullLazyValue<Collection<DeclarationDescriptor>> allDescriptors;
public DeserializedMemberScope( protected DeserializedMemberScope(
@NotNull StorageManager storageManager, @NotNull StorageManager storageManager,
@NotNull DeclarationDescriptor containingDeclaration, @NotNull DeclarationDescriptor containingDeclaration,
@NotNull DescriptorDeserializer deserializer, @NotNull DescriptorDeserializer deserializer,
@NotNull List<ProtoBuf.Callable> membersList @NotNull Collection<ProtoBuf.Callable> membersList
) { ) {
this.containingDeclaration = containingDeclaration; this.containingDeclaration = containingDeclaration;
this.deserializer = deserializer; this.deserializer = deserializer;
@@ -16,6 +16,7 @@
package org.jetbrains.jet.descriptors.serialization.descriptors; package org.jetbrains.jet.descriptors.serialization.descriptors;
import com.google.common.collect.Lists;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.descriptors.serialization.*; import org.jetbrains.jet.descriptors.serialization.*;
@@ -26,6 +27,7 @@ import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.storage.StorageManager; import org.jetbrains.jet.storage.StorageManager;
import java.util.Collection; import java.util.Collection;
import java.util.List;
public class DeserializedPackageMemberScope extends DeserializedMemberScope { public class DeserializedPackageMemberScope extends DeserializedMemberScope {
private final DescriptorFinder descriptorFinder; private final DescriptorFinder descriptorFinder;
@@ -36,13 +38,14 @@ public class DeserializedPackageMemberScope extends DeserializedMemberScope {
@NotNull StorageManager storageManager, @NotNull StorageManager storageManager,
@NotNull PackageFragmentDescriptor packageDescriptor, @NotNull PackageFragmentDescriptor packageDescriptor,
@NotNull Deserializers deserializers, @NotNull Deserializers deserializers,
@NotNull MemberFilter memberFilter,
@NotNull DescriptorFinder descriptorFinder, @NotNull DescriptorFinder descriptorFinder,
@NotNull ProtoBuf.Package proto, @NotNull ProtoBuf.Package proto,
@NotNull NameResolver nameResolver @NotNull NameResolver nameResolver
) { ) {
super(storageManager, packageDescriptor, super(storageManager, packageDescriptor,
DescriptorDeserializer.create(storageManager, packageDescriptor, nameResolver, descriptorFinder, deserializers), DescriptorDeserializer.create(storageManager, packageDescriptor, nameResolver, descriptorFinder, deserializers),
proto.getMemberList()); getFilteredMembers(packageDescriptor, proto, memberFilter, nameResolver));
this.descriptorFinder = descriptorFinder; this.descriptorFinder = descriptorFinder;
this.packageFqName = packageDescriptor.getFqName(); this.packageFqName = packageDescriptor.getFqName();
} }
@@ -51,10 +54,11 @@ public class DeserializedPackageMemberScope extends DeserializedMemberScope {
@NotNull StorageManager storageManager, @NotNull StorageManager storageManager,
@NotNull PackageFragmentDescriptor packageDescriptor, @NotNull PackageFragmentDescriptor packageDescriptor,
@NotNull Deserializers deserializers, @NotNull Deserializers deserializers,
@NotNull MemberFilter memberFilter,
@NotNull DescriptorFinder descriptorFinder, @NotNull DescriptorFinder descriptorFinder,
@NotNull PackageData packageData @NotNull PackageData packageData
) { ) {
this(storageManager, packageDescriptor, deserializers, descriptorFinder, packageData.getPackageProto(), this(storageManager, packageDescriptor, deserializers, memberFilter, descriptorFinder, packageData.getPackageProto(),
packageData.getNameResolver()); packageData.getNameResolver());
} }
@@ -85,4 +89,20 @@ public class DeserializedPackageMemberScope extends DeserializedMemberScope {
protected ReceiverParameterDescriptor getImplicitReceiver() { protected ReceiverParameterDescriptor getImplicitReceiver() {
return null; return null;
} }
@NotNull
private static Collection<ProtoBuf.Callable> getFilteredMembers(
@NotNull PackageFragmentDescriptor packageDescriptor,
@NotNull ProtoBuf.Package packageProto,
@NotNull MemberFilter memberFilter,
@NotNull NameResolver nameResolver
) {
List<ProtoBuf.Callable> result = Lists.newArrayList();
for (ProtoBuf.Callable member : packageProto.getMemberList()) {
if (memberFilter.acceptPackagePartClass(packageDescriptor, member, nameResolver)) {
result.add(member);
}
}
return result;
}
} }
@@ -0,0 +1,31 @@
/*
* Copyright 2010-2014 JetBrains s.r.o.
*
* 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 org.jetbrains.jet.descriptors.serialization.descriptors
import org.jetbrains.jet.descriptors.serialization.ProtoBuf
import org.jetbrains.jet.descriptors.serialization.NameResolver
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor
public trait MemberFilter {
fun acceptPackagePartClass(container: PackageFragmentDescriptor, member: ProtoBuf.Callable, nameResolver: NameResolver): Boolean
class object {
public val ALWAYS_TRUE: MemberFilter = object : MemberFilter {
override fun acceptPackagePartClass(container: PackageFragmentDescriptor, member: ProtoBuf.Callable, nameResolver: NameResolver): Boolean = true
}
}
}
@@ -1,46 +1,17 @@
public final class _DefaultPackage { public final class _DefaultPackage {
@org.jetbrains.annotations.NotNull
public static final java.lang.String notNull(@org.jetbrains.annotations.NotNull @jet.runtime.typeinfo.JetValueParameter(name = "a") java.lang.String a) { /* compiled code */ }
@org.jetbrains.annotations.Nullable
public static final java.lang.String nullable(@org.jetbrains.annotations.Nullable @jet.runtime.typeinfo.JetValueParameter(name = "a", type = "?") java.lang.String a) { /* compiled code */ }
@org.jetbrains.annotations.NotNull
public static final java.lang.String notNullWithNN() { /* compiled code */ }
@org.jetbrains.annotations.Nullable
@org.jetbrains.annotations.NotNull
public static final java.lang.String notNullWithN() { /* compiled code */ }
@org.jetbrains.annotations.Nullable
public static final java.lang.String nullableWithN() { /* compiled code */ }
@org.jetbrains.annotations.NotNull
@org.jetbrains.annotations.Nullable
public static final java.lang.String nullableWithNN() { /* compiled code */ }
@org.jetbrains.annotations.Nullable
public static final java.lang.String getNullableVal() { /* compiled code */ }
@org.jetbrains.annotations.Nullable
public static final java.lang.String getNullableVar() { /* compiled code */ }
@org.jetbrains.annotations.NotNull
public static final void setNullableVar(@org.jetbrains.annotations.Nullable @jet.runtime.typeinfo.JetValueParameter(name = "<set-?>", type = "?") java.lang.String p) { /* compiled code */ }
@org.jetbrains.annotations.NotNull @org.jetbrains.annotations.NotNull
public static final java.lang.String getNotNullVal() { /* compiled code */ } public static final java.lang.String getNotNullVal() { /* compiled code */ }
@org.jetbrains.annotations.Nullable
@org.jetbrains.annotations.NotNull
public static final java.lang.String getNotNullValWithGet() { /* compiled code */ }
@org.jetbrains.annotations.NotNull @org.jetbrains.annotations.NotNull
public static final java.lang.String getNotNullVar() { /* compiled code */ } public static final java.lang.String getNotNullVar() { /* compiled code */ }
@org.jetbrains.annotations.NotNull @org.jetbrains.annotations.NotNull
public static final void setNotNullVar(@org.jetbrains.annotations.NotNull @jet.runtime.typeinfo.JetValueParameter(name = "<set-?>") java.lang.String p) { /* compiled code */ } public static final void setNotNullVar(@org.jetbrains.annotations.NotNull @jet.runtime.typeinfo.JetValueParameter(name = "<set-?>") java.lang.String p) { /* compiled code */ }
@org.jetbrains.annotations.Nullable
@org.jetbrains.annotations.NotNull
public static final java.lang.String getNotNullValWithGet() { /* compiled code */ }
@org.jetbrains.annotations.Nullable @org.jetbrains.annotations.Nullable
@org.jetbrains.annotations.NotNull @org.jetbrains.annotations.NotNull
public static final java.lang.String getNotNullVarWithGetSet() { /* compiled code */ } public static final java.lang.String getNotNullVarWithGetSet() { /* compiled code */ }
@@ -49,10 +20,19 @@ public final class _DefaultPackage {
@org.jetbrains.annotations.NotNull @org.jetbrains.annotations.NotNull
public static final void setNotNullVarWithGetSet(@org.jetbrains.annotations.NotNull @jet.runtime.typeinfo.JetValueParameter(name = "v") java.lang.String v) { /* compiled code */ } public static final void setNotNullVarWithGetSet(@org.jetbrains.annotations.NotNull @jet.runtime.typeinfo.JetValueParameter(name = "v") java.lang.String v) { /* compiled code */ }
@org.jetbrains.annotations.Nullable
public static final java.lang.String getNullableVal() { /* compiled code */ }
@org.jetbrains.annotations.NotNull @org.jetbrains.annotations.NotNull
@org.jetbrains.annotations.Nullable @org.jetbrains.annotations.Nullable
public static final java.lang.String getNullableValWithGet() { /* compiled code */ } public static final java.lang.String getNullableValWithGet() { /* compiled code */ }
@org.jetbrains.annotations.Nullable
public static final java.lang.String getNullableVar() { /* compiled code */ }
@org.jetbrains.annotations.NotNull
public static final void setNullableVar(@org.jetbrains.annotations.Nullable @jet.runtime.typeinfo.JetValueParameter(name = "<set-?>", type = "?") java.lang.String p) { /* compiled code */ }
@org.jetbrains.annotations.NotNull @org.jetbrains.annotations.NotNull
@org.jetbrains.annotations.Nullable @org.jetbrains.annotations.Nullable
public static final java.lang.String getNullableVarWithGetSet() { /* compiled code */ } public static final java.lang.String getNullableVarWithGetSet() { /* compiled code */ }
@@ -60,11 +40,31 @@ public final class _DefaultPackage {
@org.jetbrains.annotations.NotNull @org.jetbrains.annotations.NotNull
public static final void setNullableVarWithGetSet(@org.jetbrains.annotations.Nullable @jet.runtime.typeinfo.JetValueParameter(name = "v", type = "?") java.lang.String v) { /* compiled code */ } public static final void setNullableVarWithGetSet(@org.jetbrains.annotations.Nullable @jet.runtime.typeinfo.JetValueParameter(name = "v", type = "?") java.lang.String v) { /* compiled code */ }
@org.jetbrains.annotations.Nullable
public static final java.lang.String getPrivateN() { /* compiled code */ }
@org.jetbrains.annotations.NotNull @org.jetbrains.annotations.NotNull
public static final java.lang.String getPrivateNn() { /* compiled code */ } public static final java.lang.String getPrivateNn() { /* compiled code */ }
@org.jetbrains.annotations.NotNull
public static final java.lang.String notNull(@org.jetbrains.annotations.NotNull @jet.runtime.typeinfo.JetValueParameter(name = "a") java.lang.String a) { /* compiled code */ }
@org.jetbrains.annotations.Nullable @org.jetbrains.annotations.Nullable
public static final java.lang.String getPrivateN() { /* compiled code */ } @org.jetbrains.annotations.NotNull
public static final java.lang.String notNullWithN() { /* compiled code */ }
@org.jetbrains.annotations.NotNull
public static final java.lang.String notNullWithNN() { /* compiled code */ }
@org.jetbrains.annotations.Nullable
public static final java.lang.String nullable(@org.jetbrains.annotations.Nullable @jet.runtime.typeinfo.JetValueParameter(name = "a", type = "?") java.lang.String a) { /* compiled code */ }
@org.jetbrains.annotations.Nullable
public static final java.lang.String nullableWithN() { /* compiled code */ }
@org.jetbrains.annotations.NotNull
@org.jetbrains.annotations.Nullable
public static final java.lang.String nullableWithNN() { /* compiled code */ }
@org.jetbrains.annotations.Nullable @org.jetbrains.annotations.Nullable
public static final java.lang.String privateFun(@org.jetbrains.annotations.NotNull @jet.runtime.typeinfo.JetValueParameter(name = "a") java.lang.String a, @org.jetbrains.annotations.Nullable @jet.runtime.typeinfo.JetValueParameter(name = "b", type = "?") java.lang.String b) { /* compiled code */ } public static final java.lang.String privateFun(@org.jetbrains.annotations.NotNull @jet.runtime.typeinfo.JetValueParameter(name = "a") java.lang.String a, @org.jetbrains.annotations.Nullable @jet.runtime.typeinfo.JetValueParameter(name = "b", type = "?") java.lang.String b) { /* compiled code */ }
@@ -22,6 +22,7 @@ import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.JetTestUtils;
import org.jetbrains.jet.cli.jvm.compiler.CliLightClassGenerationSupport; import org.jetbrains.jet.cli.jvm.compiler.CliLightClassGenerationSupport;
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter;
import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils;
import org.jetbrains.jet.lang.psi.JetElement; import org.jetbrains.jet.lang.psi.JetElement;
import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetFile;
@@ -47,7 +48,8 @@ public abstract class AbstractJetDiagnosticsTest extends BaseDiagnosticsTest {
BindingContext bindingContext = AnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration( BindingContext bindingContext = AnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(
getProject(), jetFiles, support.getTrace(), getProject(), jetFiles, support.getTrace(),
Collections.<AnalyzerScriptParameter>emptyList(), Predicates.<PsiFile>alwaysTrue(), false, support.getModule()).getBindingContext(); Collections.<AnalyzerScriptParameter>emptyList(), Predicates.<PsiFile>alwaysTrue(), false, support.getModule(),
MemberFilter.ALWAYS_TRUE).getBindingContext();
boolean ok = true; boolean ok = true;
@@ -32,6 +32,7 @@ import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.config.CommonConfigurationKeys; import org.jetbrains.jet.config.CommonConfigurationKeys;
import org.jetbrains.jet.config.CompilerConfiguration; import org.jetbrains.jet.config.CompilerConfiguration;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor; import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor;
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter;
import org.jetbrains.jet.di.InjectorForTopDownAnalyzerForJvm; import org.jetbrains.jet.di.InjectorForTopDownAnalyzerForJvm;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.*;
@@ -152,7 +153,8 @@ public abstract class AbstractLoadJavaTest extends TestCaseWithTmpdir {
environment.getProject(), environment.getProject(),
parameters, parameters,
trace, trace,
module); module,
MemberFilter.ALWAYS_TRUE);
module.addFragmentProvider(DependencyKind.BINARIES, injectorForAnalyzer.getJavaDescriptorResolver().getPackageFragmentProvider()); module.addFragmentProvider(DependencyKind.BINARIES, injectorForAnalyzer.getJavaDescriptorResolver().getPackageFragmentProvider());
@@ -26,6 +26,7 @@ import org.jetbrains.jet.cli.jvm.compiler.CliLightClassGenerationSupport;
import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment; import org.jetbrains.jet.cli.jvm.compiler.JetCoreEnvironment;
import org.jetbrains.jet.context.ContextPackage; import org.jetbrains.jet.context.ContextPackage;
import org.jetbrains.jet.context.GlobalContextImpl; import org.jetbrains.jet.context.GlobalContextImpl;
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter;
import org.jetbrains.jet.di.InjectorForTopDownAnalyzerForJvm; import org.jetbrains.jet.di.InjectorForTopDownAnalyzerForJvm;
import org.jetbrains.jet.lang.descriptors.DependencyKind; import org.jetbrains.jet.lang.descriptors.DependencyKind;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor; import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
@@ -60,7 +61,7 @@ public class LazyResolveTestUtil {
ModuleDescriptorImpl sharedModule = support.getModule(); ModuleDescriptorImpl sharedModule = support.getModule();
InjectorForTopDownAnalyzerForJvm injector = InjectorForTopDownAnalyzerForJvm injector =
new InjectorForTopDownAnalyzerForJvm(environment.getProject(), params, sharedTrace, sharedModule); new InjectorForTopDownAnalyzerForJvm(environment.getProject(), params, sharedTrace, sharedModule, MemberFilter.ALWAYS_TRUE);
sharedModule.addFragmentProvider(DependencyKind.BINARIES, injector.getJavaDescriptorResolver().getPackageFragmentProvider()); sharedModule.addFragmentProvider(DependencyKind.BINARIES, injector.getJavaDescriptorResolver().getPackageFragmentProvider());
injector.getTopDownAnalyzer().analyzeFiles(params, files); injector.getTopDownAnalyzer().analyzeFiles(params, files);
return injector.getModuleDescriptor(); return injector.getModuleDescriptor();
@@ -24,6 +24,7 @@ import org.jetbrains.jet.descriptors.serialization.DescriptorFinder;
import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil; import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor; import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope; import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope;
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor; import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
@@ -45,6 +46,8 @@ import static org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassHeader.Kin
public final class DeserializedDescriptorResolver { public final class DeserializedDescriptorResolver {
private DescriptorDeserializers annotationDeserializer; private DescriptorDeserializers annotationDeserializer;
private MemberFilter memberFilter;
private StorageManager storageManager; private StorageManager storageManager;
private JavaPackageFragmentProvider javaPackageFragmentProvider; private JavaPackageFragmentProvider javaPackageFragmentProvider;
@@ -73,6 +76,11 @@ public final class DeserializedDescriptorResolver {
this.annotationDeserializer = annotationDeserializer; this.annotationDeserializer = annotationDeserializer;
} }
@Inject
public void setMemberFilter(MemberFilter memberFilter) {
this.memberFilter = memberFilter;
}
@Inject @Inject
public void setJavaPackageFragmentProvider(JavaPackageFragmentProvider javaPackageFragmentProvider) { public void setJavaPackageFragmentProvider(JavaPackageFragmentProvider javaPackageFragmentProvider) {
this.javaPackageFragmentProvider = javaPackageFragmentProvider; this.javaPackageFragmentProvider = javaPackageFragmentProvider;
@@ -108,8 +116,8 @@ public final class DeserializedDescriptorResolver {
public JetScope createKotlinPackageScope(@NotNull PackageFragmentDescriptor descriptor, @NotNull KotlinJvmBinaryClass kotlinClass) { public JetScope createKotlinPackageScope(@NotNull PackageFragmentDescriptor descriptor, @NotNull KotlinJvmBinaryClass kotlinClass) {
String[] data = readData(kotlinClass, PACKAGE_FACADE); String[] data = readData(kotlinClass, PACKAGE_FACADE);
if (data != null) { if (data != null) {
return new DeserializedPackageMemberScope(storageManager, descriptor, annotationDeserializer, javaDescriptorFinder, return new DeserializedPackageMemberScope(storageManager, descriptor, annotationDeserializer,
JavaProtoBufUtil.readPackageDataFrom(data)); memberFilter, javaDescriptorFinder, JavaProtoBufUtil.readPackageDataFrom(data));
} }
return null; return null;
} }
@@ -6,6 +6,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.descriptors.serialization.*; import org.jetbrains.jet.descriptors.serialization.*;
import org.jetbrains.jet.descriptors.serialization.descriptors.Deserializers; import org.jetbrains.jet.descriptors.serialization.descriptors.Deserializers;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope; import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope;
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter;
import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.Annotations; import org.jetbrains.jet.lang.descriptors.annotations.Annotations;
import org.jetbrains.jet.lang.descriptors.impl.DeclarationDescriptorImpl; import org.jetbrains.jet.lang.descriptors.impl.DeclarationDescriptorImpl;
@@ -39,7 +40,7 @@ class BuiltinsPackageFragment extends DeclarationDescriptorImpl implements Packa
packageFragmentProvider = new BuiltinsPackageFragmentProvider(); packageFragmentProvider = new BuiltinsPackageFragmentProvider();
// TODO: support annotations // TODO: support annotations
members = new DeserializedPackageMemberScope(storageManager, this, Deserializers.UNSUPPORTED, members = new DeserializedPackageMemberScope(storageManager, this, Deserializers.UNSUPPORTED, MemberFilter.ALWAYS_TRUE,
new BuiltInsDescriptorFinder(storageManager), loadPackage(), nameResolver); new BuiltInsDescriptorFinder(storageManager), loadPackage(), nameResolver);
} }
@@ -33,7 +33,7 @@ import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices
import org.jetbrains.jet.di.* import org.jetbrains.jet.di.*
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingComponents import org.jetbrains.jet.lang.types.expressions.ExpressionTypingComponents
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils import org.jetbrains.jet.lang.types.expressions.ExpressionTypingUtils
import org.jetbrains.jet.context.SimpleGlobalContext import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter
// NOTE: After making changes, you need to re-generate the injectors. // NOTE: After making changes, you need to re-generate the injectors.
// To do that, you can run main in this file. // To do that, you can run main in this file.
@@ -94,6 +94,8 @@ private fun generatorForTopDownAnalyzerForJvm() =
implementInterface(javaClass<InjectorForTopDownAnalyzer>()) implementInterface(javaClass<InjectorForTopDownAnalyzer>())
commonForTopDownAnalyzer() commonForTopDownAnalyzer()
parameter(javaClass<MemberFilter>())
publicField(javaClass<JavaDescriptorResolver>()) publicField(javaClass<JavaDescriptorResolver>())
fields( fields(
@@ -131,6 +133,8 @@ private fun generatorForJavaDescriptorResolver() =
) )
field(javaClass<VirtualFileFinder>(), field(javaClass<VirtualFileFinder>(),
init = GivenExpression(javaClass<VirtualFileFinder>().getName() + ".SERVICE.getInstance(project)")) init = GivenExpression(javaClass<VirtualFileFinder>().getName() + ".SERVICE.getInstance(project)"))
field(javaClass<MemberFilter>(),
init = GivenExpression(javaClass<MemberFilter>().getName() + ".ALWAYS_TRUE"))
} }
private fun generatorForLazyResolveWithJava() = private fun generatorForLazyResolveWithJava() =
@@ -151,6 +155,8 @@ private fun generatorForLazyResolveWithJava() =
field(javaClass<VirtualFileFinder>(), field(javaClass<VirtualFileFinder>(),
init = GivenExpression(javaClass<VirtualFileFinder>().getName() + ".SERVICE.getInstance(project)")) init = GivenExpression(javaClass<VirtualFileFinder>().getName() + ".SERVICE.getInstance(project)"))
field(javaClass<MemberFilter>(),
init = GivenExpression(javaClass<MemberFilter>().getName() + ".ALWAYS_TRUE"))
fields( fields(
javaClass<JavaClassFinderImpl>(), javaClass<JavaClassFinderImpl>(),
javaClass<TraceBasedExternalSignatureResolver>(), javaClass<TraceBasedExternalSignatureResolver>(),
@@ -43,6 +43,7 @@ import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe
import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializers import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializers
import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage
import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorDeserializer import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorDeserializer
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter
public fun DeserializerForDecompiler(classFile: VirtualFile): DeserializerForDecompiler { public fun DeserializerForDecompiler(classFile: VirtualFile): DeserializerForDecompiler {
val kotlinClass = KotlinBinaryClassCache.getKotlinBinaryClass(classFile) val kotlinClass = KotlinBinaryClassCache.getKotlinBinaryClass(classFile)
@@ -69,6 +70,7 @@ public class DeserializerForDecompiler(val packageDirectory: VirtualFile, val di
storageManager, storageManager,
createDummyPackageFragment(packageFqName), createDummyPackageFragment(packageFqName),
deserializers, deserializers,
MemberFilter.ALWAYS_TRUE,
descriptorFinder, descriptorFinder,
JavaProtoBufUtil.readPackageDataFrom(annotationData) JavaProtoBufUtil.readPackageDataFrom(annotationData)
) )
@@ -37,6 +37,7 @@ import org.jetbrains.jet.analyzer.AnalyzeExhaust;
import org.jetbrains.jet.asJava.LightClassUtil; import org.jetbrains.jet.asJava.LightClassUtil;
import org.jetbrains.jet.context.ContextPackage; import org.jetbrains.jet.context.ContextPackage;
import org.jetbrains.jet.context.GlobalContext; import org.jetbrains.jet.context.GlobalContext;
import org.jetbrains.jet.descriptors.serialization.descriptors.MemberFilter;
import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils; import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils;
import org.jetbrains.jet.lang.diagnostics.Errors; import org.jetbrains.jet.lang.diagnostics.Errors;
import org.jetbrains.jet.lang.psi.JetElement; import org.jetbrains.jet.lang.psi.JetElement;
@@ -201,7 +202,8 @@ public final class AnalyzerFacadeWithCache {
Predicates.<PsiFile>alwaysFalse(), Predicates.<PsiFile>alwaysFalse(),
true, true,
AnalyzerFacadeForJVM.createJavaModule("<module>"), AnalyzerFacadeForJVM.createJavaModule("<module>"),
globalContext globalContext,
MemberFilter.ALWAYS_TRUE
); );
} }
@@ -191,6 +191,10 @@ public class KotlinBuilder extends ModuleLevelBuilder {
} }
for (SimpleOutputItem outputItem : outputItemCollector.getOutputs()) { for (SimpleOutputItem outputItem : outputItemCollector.getOutputs()) {
// TODO this is a hack: we don't remove
if (outputItem.getOutputFile().getName().endsWith("Package.class")) {
continue;
}
BuildTarget<?> target = null; BuildTarget<?> target = null;
Collection<File> sourceFiles = outputItem.getSourceFiles(); Collection<File> sourceFiles = outputItem.getSourceFiles();
if (sourceFiles != null && !sourceFiles.isEmpty()) { if (sourceFiles != null && !sourceFiles.isEmpty()) {
@@ -200,7 +204,8 @@ public class KotlinBuilder extends ModuleLevelBuilder {
messageCollector.report(EXCEPTION, "KotlinBuilder: outputItem.sourceFiles is null or empty, outputItem = " + outputItem, NO_LOCATION); messageCollector.report(EXCEPTION, "KotlinBuilder: outputItem.sourceFiles is null or empty, outputItem = " + outputItem, NO_LOCATION);
} }
outputConsumer.registerOutputFile(target != null ? target : representativeTarget, outputItem.getOutputFile(), paths(sourceFiles)); outputConsumer.registerOutputFile(target != null ? target : representativeTarget, outputItem.getOutputFile(),
paths(sourceFiles));
} }
// TODO should mark dependencies as dirty, as well // TODO should mark dependencies as dirty, as well
@@ -98,6 +98,10 @@ public class IncrementalJpsTest : JpsBuildTestCase() {
doTest() doTest()
} }
fun testTopLevelMembersInTwoPackages() {
doTest()
}
private class MyLogger(val rootPath: String) : ProjectBuilderLoggerBase() { private class MyLogger(val rootPath: String) : ProjectBuilderLoggerBase() {
private val logBuf = StringBuilder() private val logBuf = StringBuilder()
public val log: String public val log: String
@@ -0,0 +1,9 @@
package test
fun foo() {
bar(5)
baz()
}
fun baz() {
}
@@ -0,0 +1,9 @@
package test
fun foo() {
bar(4)
baz()
}
fun baz() {
}
@@ -0,0 +1,9 @@
package test
fun bar(i: Int): String {
return "$i ${quux()} $i"
}
fun quux(): String {
return "quux"
}
@@ -0,0 +1,12 @@
Cleaning output files:
out/production/module/test/TestPackage-a-*.class
End of files
Compiling files:
src/a.kt
End of files
Cleaning output files:
out/production/module/test/TestPackage-b-*.class
End of files
Compiling files:
src/b.kt
End of files