diff --git a/build.xml b/build.xml
index 2e7d6e393da..e981cd215a2 100644
--- a/build.xml
+++ b/build.xml
@@ -125,7 +125,6 @@
-
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java
index bdddd861162..4259c6f290f 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java
@@ -19,7 +19,6 @@ package org.jetbrains.jet.codegen;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import org.jetbrains.org.objectweb.asm.*;
import org.jetbrains.jet.codegen.state.JetTypeMapper;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.Annotated;
@@ -30,7 +29,6 @@ import org.jetbrains.jet.lang.psi.JetClass;
import org.jetbrains.jet.lang.psi.JetModifierList;
import org.jetbrains.jet.lang.psi.JetModifierListOwner;
import org.jetbrains.jet.lang.resolve.BindingContext;
-import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
import org.jetbrains.jet.lang.resolve.constants.*;
import org.jetbrains.jet.lang.resolve.constants.StringValue;
@@ -38,6 +36,7 @@ import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeUtils;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
+import org.jetbrains.org.objectweb.asm.*;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -46,7 +45,34 @@ import java.util.*;
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration;
public abstract class AnnotationCodegen {
- public static final FqName VOLATILE_FQ_NAME = new FqName("kotlin.volatile");
+
+ public static final class JvmFlagAnnotation {
+ private final FqName fqName;
+ private final int jvmFlag;
+
+ public JvmFlagAnnotation(@NotNull String fqName, int jvmFlag) {
+ this.fqName = new FqName(fqName);
+ this.jvmFlag = jvmFlag;
+ }
+
+ public boolean hasAnnotation(@NotNull Annotated annotated) {
+ return annotated.getAnnotations().findAnnotation(fqName) != null;
+ }
+
+ public int getJvmFlag() {
+ return jvmFlag;
+ }
+ }
+
+ public static final List FIELD_FLAGS = Arrays.asList(
+ new JvmFlagAnnotation("kotlin.jvm.volatile", Opcodes.ACC_VOLATILE),
+ new JvmFlagAnnotation("kotlin.jvm.transient", Opcodes.ACC_TRANSIENT)
+ );
+
+ public static final List METHOD_FLAGS = Arrays.asList(
+ new JvmFlagAnnotation("kotlin.jvm.strictfp", Opcodes.ACC_STRICT),
+ new JvmFlagAnnotation("kotlin.jvm.synchronized", Opcodes.ACC_SYNCHRONIZED)
+ );
private static final AnnotationVisitor NO_ANNOTATION_VISITOR = new AnnotationVisitor(Opcodes.ASM5) {};
@@ -91,7 +117,6 @@ public abstract class AnnotationCodegen {
AnnotationDescriptor annotationDescriptor = bindingContext.get(BindingContext.ANNOTATION, annotationEntry);
if (annotationDescriptor == null) continue; // Skipping annotations if they are not resolved. Needed for JetLightClass generation
- if (isVolatile(annotationDescriptor)) continue;
String descriptor = genAnnotation(annotationDescriptor);
if (descriptor != null) {
@@ -149,11 +174,6 @@ public abstract class AnnotationCodegen {
return !type.isNullable() && classifier instanceof TypeParameterDescriptor && TypeUtils.hasNullableSuperType(type);
}
- private static boolean isVolatile(@NotNull AnnotationDescriptor annotationDescriptor) {
- ClassifierDescriptor classDescriptor = annotationDescriptor.getType().getConstructor().getDeclarationDescriptor();
- return classDescriptor != null && DescriptorUtils.getFqName(classDescriptor).equals(VOLATILE_FQ_NAME.toUnsafe());
- }
-
public void generateAnnotationDefaultValue(@NotNull CompileTimeConstant value, @NotNull JetType expectedType) {
AnnotationVisitor visitor = visitAnnotation(null, false); // Parameters are unimportant
genCompileTimeValue(null, value, expectedType, visitor);
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java
index 26c40aea5ca..c2c133a3d66 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java
@@ -169,6 +169,12 @@ public class AsmUtil {
public static int getMethodAsmFlags(FunctionDescriptor functionDescriptor, OwnerKind kind) {
int flags = getCommonCallableFlags(functionDescriptor);
+ for (AnnotationCodegen.JvmFlagAnnotation flagAnnotation : AnnotationCodegen.METHOD_FLAGS) {
+ if (flagAnnotation.hasAnnotation(functionDescriptor.getOriginal())) {
+ flags |= flagAnnotation.getJvmFlag();
+ }
+ }
+
if (functionDescriptor.getModality() == Modality.FINAL && !(functionDescriptor instanceof ConstructorDescriptor)) {
DeclarationDescriptor containingDeclaration = functionDescriptor.getContainingDeclaration();
if (!(containingDeclaration instanceof ClassDescriptor) ||
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java
index 18f022d423d..5e447daaf38 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java
@@ -189,8 +189,10 @@ public class PropertyCodegen {
private FieldVisitor generateBackingField(JetNamedDeclaration element, PropertyDescriptor propertyDescriptor, boolean isDelegate, JetType jetType, Object defaultValue) {
int modifiers = getDeprecatedAccessFlag(propertyDescriptor);
- if (propertyDescriptor.getOriginal().getAnnotations().findAnnotation(AnnotationCodegen.VOLATILE_FQ_NAME) != null) {
- modifiers |= ACC_VOLATILE;
+ for (AnnotationCodegen.JvmFlagAnnotation flagAnnotation : AnnotationCodegen.FIELD_FLAGS) {
+ if (flagAnnotation.hasAnnotation(propertyDescriptor.getOriginal())) {
+ modifiers |= flagAnnotation.getJvmFlag();
+ }
}
if (kind == OwnerKind.PACKAGE) {
diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java
index 2f73d6adbc3..7a41789091f 100644
--- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java
+++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForJavaDescriptorResolver.java
@@ -33,10 +33,11 @@ import org.jetbrains.jet.lang.resolve.kotlin.VirtualFileFinder;
import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider;
import org.jetbrains.jet.lang.resolve.java.lazy.GlobalJavaResolverContext;
import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver;
-import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializers;
-import org.jetbrains.jet.lang.resolve.kotlin.AnnotationDescriptorDeserializer;
+import org.jetbrains.jet.lang.resolve.kotlin.DeserializationGlobalContextForJava;
+import org.jetbrains.jet.lang.resolve.kotlin.JavaDescriptorFinder;
+import org.jetbrains.jet.lang.resolve.kotlin.AnnotationDescriptorLoader;
import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage;
-import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorDeserializer;
+import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorLoader;
import org.jetbrains.annotations.NotNull;
import javax.annotation.PreDestroy;
@@ -61,10 +62,11 @@ public class InjectorForJavaDescriptorResolver {
private final LazyJavaPackageFragmentProvider lazyJavaPackageFragmentProvider;
private final GlobalJavaResolverContext globalJavaResolverContext;
private final DeserializedDescriptorResolver deserializedDescriptorResolver;
- private final DescriptorDeserializers descriptorDeserializers;
- private final AnnotationDescriptorDeserializer annotationDescriptorDeserializer;
+ private final DeserializationGlobalContextForJava deserializationGlobalContextForJava;
+ private final JavaDescriptorFinder javaDescriptorFinder;
+ private final AnnotationDescriptorLoader annotationDescriptorLoader;
private final DescriptorDeserializersStorage descriptorDeserializersStorage;
- private final ConstantDescriptorDeserializer constantDescriptorDeserializer;
+ private final ConstantDescriptorLoader constantDescriptorLoader;
public InjectorForJavaDescriptorResolver(
@NotNull Project project,
@@ -87,10 +89,11 @@ public class InjectorForJavaDescriptorResolver {
this.globalJavaResolverContext = new GlobalJavaResolverContext(lockBasedStorageManager, getJavaClassFinder(), virtualFileFinder, deserializedDescriptorResolver, psiBasedExternalAnnotationResolver, traceBasedExternalSignatureResolver, traceBasedErrorReporter, psiBasedMethodSignatureChecker, traceBasedJavaResolverCache, javaPropertyInitializerEvaluator);
this.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, getModule());
this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, getModule());
- this.descriptorDeserializers = new DescriptorDeserializers();
- this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer();
+ this.javaDescriptorFinder = new JavaDescriptorFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider);
+ this.annotationDescriptorLoader = new AnnotationDescriptorLoader();
+ this.constantDescriptorLoader = new ConstantDescriptorLoader();
+ this.deserializationGlobalContextForJava = new DeserializationGlobalContextForJava(lockBasedStorageManager, javaDescriptorFinder, annotationDescriptorLoader, constantDescriptorLoader, lazyJavaPackageFragmentProvider);
this.descriptorDeserializersStorage = new DescriptorDeserializersStorage(lockBasedStorageManager);
- this.constantDescriptorDeserializer = new ConstantDescriptorDeserializer();
this.javaClassFinder.setProject(project);
@@ -105,27 +108,21 @@ public class InjectorForJavaDescriptorResolver {
psiBasedMethodSignatureChecker.setExternalAnnotationResolver(psiBasedExternalAnnotationResolver);
psiBasedMethodSignatureChecker.setExternalSignatureResolver(traceBasedExternalSignatureResolver);
- deserializedDescriptorResolver.setDeserializers(descriptorDeserializers);
+ deserializedDescriptorResolver.setContext(deserializationGlobalContextForJava);
deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter);
- deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver);
- deserializedDescriptorResolver.setJavaPackageFragmentProvider(lazyJavaPackageFragmentProvider);
- deserializedDescriptorResolver.setStorageManager(lockBasedStorageManager);
- descriptorDeserializers.setAnnotationDescriptorDeserializer(annotationDescriptorDeserializer);
- descriptorDeserializers.setConstantDescriptorDeserializer(constantDescriptorDeserializer);
-
- annotationDescriptorDeserializer.setClassResolver(javaDescriptorResolver);
- annotationDescriptorDeserializer.setErrorReporter(traceBasedErrorReporter);
- annotationDescriptorDeserializer.setKotlinClassFinder(virtualFileFinder);
- annotationDescriptorDeserializer.setStorage(descriptorDeserializersStorage);
+ annotationDescriptorLoader.setClassResolver(javaDescriptorResolver);
+ annotationDescriptorLoader.setErrorReporter(traceBasedErrorReporter);
+ annotationDescriptorLoader.setKotlinClassFinder(virtualFileFinder);
+ annotationDescriptorLoader.setStorage(descriptorDeserializersStorage);
descriptorDeserializersStorage.setClassResolver(javaDescriptorResolver);
descriptorDeserializersStorage.setErrorReporter(traceBasedErrorReporter);
- constantDescriptorDeserializer.setClassResolver(javaDescriptorResolver);
- constantDescriptorDeserializer.setErrorReporter(traceBasedErrorReporter);
- constantDescriptorDeserializer.setKotlinClassFinder(virtualFileFinder);
- constantDescriptorDeserializer.setStorage(descriptorDeserializersStorage);
+ constantDescriptorLoader.setClassResolver(javaDescriptorResolver);
+ constantDescriptorLoader.setErrorReporter(traceBasedErrorReporter);
+ constantDescriptorLoader.setKotlinClassFinder(virtualFileFinder);
+ constantDescriptorLoader.setStorage(descriptorDeserializersStorage);
javaClassFinder.initialize();
diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForLazyResolveWithJava.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForLazyResolveWithJava.java
index 4073d7ee699..b6544c082b3 100644
--- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForLazyResolveWithJava.java
+++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForLazyResolveWithJava.java
@@ -55,10 +55,11 @@ import org.jetbrains.jet.lang.resolve.ScriptBodyResolver;
import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider;
import org.jetbrains.jet.lang.resolve.java.lazy.GlobalJavaResolverContext;
import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver;
-import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializers;
-import org.jetbrains.jet.lang.resolve.kotlin.AnnotationDescriptorDeserializer;
+import org.jetbrains.jet.lang.resolve.kotlin.DeserializationGlobalContextForJava;
+import org.jetbrains.jet.lang.resolve.kotlin.JavaDescriptorFinder;
+import org.jetbrains.jet.lang.resolve.kotlin.AnnotationDescriptorLoader;
import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage;
-import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorDeserializer;
+import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorLoader;
import org.jetbrains.annotations.NotNull;
import javax.annotation.PreDestroy;
@@ -105,10 +106,11 @@ public class InjectorForLazyResolveWithJava {
private final LazyJavaPackageFragmentProvider lazyJavaPackageFragmentProvider;
private final GlobalJavaResolverContext globalJavaResolverContext;
private final DeserializedDescriptorResolver deserializedDescriptorResolver;
- private final DescriptorDeserializers descriptorDeserializers;
- private final AnnotationDescriptorDeserializer annotationDescriptorDeserializer;
+ private final DeserializationGlobalContextForJava deserializationGlobalContextForJava;
+ private final JavaDescriptorFinder javaDescriptorFinder;
+ private final AnnotationDescriptorLoader annotationDescriptorLoader;
private final DescriptorDeserializersStorage descriptorDeserializersStorage;
- private final ConstantDescriptorDeserializer constantDescriptorDeserializer;
+ private final ConstantDescriptorLoader constantDescriptorLoader;
public InjectorForLazyResolveWithJava(
@NotNull Project project,
@@ -155,10 +157,11 @@ public class InjectorForLazyResolveWithJava {
this.jetImportsFactory = new JetImportsFactory();
this.scopeProvider = new ScopeProvider(getResolveSession());
this.scriptBodyResolver = new ScriptBodyResolver();
- this.descriptorDeserializers = new DescriptorDeserializers();
- this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer();
+ this.javaDescriptorFinder = new JavaDescriptorFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider);
+ this.annotationDescriptorLoader = new AnnotationDescriptorLoader();
+ this.constantDescriptorLoader = new ConstantDescriptorLoader();
+ this.deserializationGlobalContextForJava = new DeserializationGlobalContextForJava(lockBasedStorageManager, javaDescriptorFinder, annotationDescriptorLoader, constantDescriptorLoader, lazyJavaPackageFragmentProvider);
this.descriptorDeserializersStorage = new DescriptorDeserializersStorage(lockBasedStorageManager);
- this.constantDescriptorDeserializer = new ConstantDescriptorDeserializer();
this.resolveSession.setAnnotationResolve(annotationResolver);
this.resolveSession.setDescriptorResolver(descriptorResolver);
@@ -235,27 +238,21 @@ public class InjectorForLazyResolveWithJava {
scriptBodyResolver.setExpressionTypingServices(expressionTypingServices);
- deserializedDescriptorResolver.setDeserializers(descriptorDeserializers);
+ deserializedDescriptorResolver.setContext(deserializationGlobalContextForJava);
deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter);
- deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver);
- deserializedDescriptorResolver.setJavaPackageFragmentProvider(lazyJavaPackageFragmentProvider);
- deserializedDescriptorResolver.setStorageManager(lockBasedStorageManager);
- descriptorDeserializers.setAnnotationDescriptorDeserializer(annotationDescriptorDeserializer);
- descriptorDeserializers.setConstantDescriptorDeserializer(constantDescriptorDeserializer);
-
- annotationDescriptorDeserializer.setClassResolver(javaDescriptorResolver);
- annotationDescriptorDeserializer.setErrorReporter(traceBasedErrorReporter);
- annotationDescriptorDeserializer.setKotlinClassFinder(virtualFileFinder);
- annotationDescriptorDeserializer.setStorage(descriptorDeserializersStorage);
+ annotationDescriptorLoader.setClassResolver(javaDescriptorResolver);
+ annotationDescriptorLoader.setErrorReporter(traceBasedErrorReporter);
+ annotationDescriptorLoader.setKotlinClassFinder(virtualFileFinder);
+ annotationDescriptorLoader.setStorage(descriptorDeserializersStorage);
descriptorDeserializersStorage.setClassResolver(javaDescriptorResolver);
descriptorDeserializersStorage.setErrorReporter(traceBasedErrorReporter);
- constantDescriptorDeserializer.setClassResolver(javaDescriptorResolver);
- constantDescriptorDeserializer.setErrorReporter(traceBasedErrorReporter);
- constantDescriptorDeserializer.setKotlinClassFinder(virtualFileFinder);
- constantDescriptorDeserializer.setStorage(descriptorDeserializersStorage);
+ constantDescriptorLoader.setClassResolver(javaDescriptorResolver);
+ constantDescriptorLoader.setErrorReporter(traceBasedErrorReporter);
+ constantDescriptorLoader.setKotlinClassFinder(virtualFileFinder);
+ constantDescriptorLoader.setStorage(descriptorDeserializersStorage);
javaClassFinder.initialize();
diff --git a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java
index 44164928dfe..cec7ca9a1ae 100644
--- a/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java
+++ b/compiler/frontend.java/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerForJvm.java
@@ -26,7 +26,7 @@ import org.jetbrains.jet.lang.resolve.TopDownAnalyzer;
import org.jetbrains.jet.lang.resolve.LazyTopDownAnalyzer;
import org.jetbrains.jet.lang.resolve.MutablePackageFragmentProvider;
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
-import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializers;
+import org.jetbrains.jet.lang.resolve.kotlin.DeserializationGlobalContextForJava;
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.TraceBasedJavaResolverCache;
@@ -59,16 +59,17 @@ import org.jetbrains.jet.lang.resolve.ScriptBodyResolver;
import org.jetbrains.jet.lang.resolve.DeclarationResolver;
import org.jetbrains.jet.lang.resolve.ImportsResolver;
import org.jetbrains.jet.lang.psi.JetImportsFactory;
-import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver;
import org.jetbrains.jet.lang.resolve.OverloadResolver;
import org.jetbrains.jet.lang.resolve.OverrideResolver;
import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver;
+import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver;
import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider;
import org.jetbrains.jet.lang.resolve.java.lazy.GlobalJavaResolverContext;
import org.jetbrains.jet.lang.resolve.kotlin.DeserializedDescriptorResolver;
-import org.jetbrains.jet.lang.resolve.kotlin.AnnotationDescriptorDeserializer;
+import org.jetbrains.jet.lang.resolve.kotlin.JavaDescriptorFinder;
+import org.jetbrains.jet.lang.resolve.kotlin.AnnotationDescriptorLoader;
import org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage;
-import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorDeserializer;
+import org.jetbrains.jet.lang.resolve.kotlin.ConstantDescriptorLoader;
import org.jetbrains.annotations.NotNull;
import javax.annotation.PreDestroy;
@@ -86,7 +87,7 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
private final LazyTopDownAnalyzer lazyTopDownAnalyzer;
private final MutablePackageFragmentProvider mutablePackageFragmentProvider;
private final JavaDescriptorResolver javaDescriptorResolver;
- private final DescriptorDeserializers descriptorDeserializers;
+ private final DeserializationGlobalContextForJava deserializationGlobalContextForJava;
private final JavaClassFinderImpl javaClassFinder;
private final TraceBasedExternalSignatureResolver traceBasedExternalSignatureResolver;
private final TraceBasedJavaResolverCache traceBasedJavaResolverCache;
@@ -119,16 +120,17 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
private final DeclarationResolver declarationResolver;
private final ImportsResolver importsResolver;
private final JetImportsFactory jetImportsFactory;
- private final ScriptHeaderResolver scriptHeaderResolver;
private final OverloadResolver overloadResolver;
private final OverrideResolver overrideResolver;
private final TypeHierarchyResolver typeHierarchyResolver;
+ private final ScriptHeaderResolver scriptHeaderResolver;
private final LazyJavaPackageFragmentProvider lazyJavaPackageFragmentProvider;
private final GlobalJavaResolverContext globalJavaResolverContext;
private final DeserializedDescriptorResolver deserializedDescriptorResolver;
- private final AnnotationDescriptorDeserializer annotationDescriptorDeserializer;
+ private final JavaDescriptorFinder javaDescriptorFinder;
+ private final AnnotationDescriptorLoader annotationDescriptorLoader;
private final DescriptorDeserializersStorage descriptorDeserializersStorage;
- private final ConstantDescriptorDeserializer constantDescriptorDeserializer;
+ private final ConstantDescriptorLoader constantDescriptorLoader;
public InjectorForTopDownAnalyzerForJvm(
@NotNull Project project,
@@ -157,7 +159,10 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
this.globalJavaResolverContext = new GlobalJavaResolverContext(storageManager, javaClassFinder, virtualFileFinder, deserializedDescriptorResolver, psiBasedExternalAnnotationResolver, traceBasedExternalSignatureResolver, traceBasedErrorReporter, psiBasedMethodSignatureChecker, traceBasedJavaResolverCache, javaPropertyInitializerEvaluator);
this.lazyJavaPackageFragmentProvider = new LazyJavaPackageFragmentProvider(globalJavaResolverContext, getModuleDescriptor());
this.javaDescriptorResolver = new JavaDescriptorResolver(lazyJavaPackageFragmentProvider, getModuleDescriptor());
- this.descriptorDeserializers = new DescriptorDeserializers();
+ this.javaDescriptorFinder = new JavaDescriptorFinder(getJavaDescriptorResolver(), lazyJavaPackageFragmentProvider);
+ this.annotationDescriptorLoader = new AnnotationDescriptorLoader();
+ this.constantDescriptorLoader = new ConstantDescriptorLoader();
+ this.deserializationGlobalContextForJava = new DeserializationGlobalContextForJava(storageManager, javaDescriptorFinder, annotationDescriptorLoader, constantDescriptorLoader, lazyJavaPackageFragmentProvider);
this.bodyResolver = new BodyResolver();
this.annotationResolver = new AnnotationResolver();
this.callResolver = new CallResolver();
@@ -182,13 +187,11 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
this.declarationResolver = new DeclarationResolver();
this.importsResolver = new ImportsResolver();
this.jetImportsFactory = new JetImportsFactory();
- this.scriptHeaderResolver = new ScriptHeaderResolver();
this.overloadResolver = new OverloadResolver();
this.overrideResolver = new OverrideResolver();
this.typeHierarchyResolver = new TypeHierarchyResolver();
- this.annotationDescriptorDeserializer = new AnnotationDescriptorDeserializer();
+ this.scriptHeaderResolver = new ScriptHeaderResolver();
this.descriptorDeserializersStorage = new DescriptorDeserializersStorage(storageManager);
- this.constantDescriptorDeserializer = new ConstantDescriptorDeserializer();
this.topDownAnalyzer.setBodyResolver(bodyResolver);
this.topDownAnalyzer.setDeclarationResolver(declarationResolver);
@@ -208,9 +211,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
this.lazyTopDownAnalyzer.setOverrideResolver(overrideResolver);
this.lazyTopDownAnalyzer.setTrace(bindingTrace);
- this.descriptorDeserializers.setAnnotationDescriptorDeserializer(annotationDescriptorDeserializer);
- this.descriptorDeserializers.setConstantDescriptorDeserializer(constantDescriptorDeserializer);
-
javaClassFinder.setProject(project);
traceBasedExternalSignatureResolver.setExternalAnnotationResolver(psiBasedExternalAnnotationResolver);
@@ -296,7 +296,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
declarationResolver.setAnnotationResolver(annotationResolver);
declarationResolver.setDescriptorResolver(descriptorResolver);
declarationResolver.setImportsResolver(importsResolver);
- declarationResolver.setScriptHeaderResolver(scriptHeaderResolver);
declarationResolver.setTrace(bindingTrace);
importsResolver.setImportsFactory(jetImportsFactory);
@@ -306,9 +305,6 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
jetImportsFactory.setProject(project);
- scriptHeaderResolver.setPackageFragmentProvider(mutablePackageFragmentProvider);
- scriptHeaderResolver.setTrace(bindingTrace);
-
overloadResolver.setTrace(bindingTrace);
overrideResolver.setTrace(bindingTrace);
@@ -319,24 +315,24 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
typeHierarchyResolver.setScriptHeaderResolver(scriptHeaderResolver);
typeHierarchyResolver.setTrace(bindingTrace);
- deserializedDescriptorResolver.setDeserializers(descriptorDeserializers);
- deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter);
- deserializedDescriptorResolver.setJavaDescriptorResolver(javaDescriptorResolver);
- deserializedDescriptorResolver.setJavaPackageFragmentProvider(lazyJavaPackageFragmentProvider);
- deserializedDescriptorResolver.setStorageManager(storageManager);
+ scriptHeaderResolver.setPackageFragmentProvider(mutablePackageFragmentProvider);
+ scriptHeaderResolver.setTrace(bindingTrace);
- annotationDescriptorDeserializer.setClassResolver(javaDescriptorResolver);
- annotationDescriptorDeserializer.setErrorReporter(traceBasedErrorReporter);
- annotationDescriptorDeserializer.setKotlinClassFinder(virtualFileFinder);
- annotationDescriptorDeserializer.setStorage(descriptorDeserializersStorage);
+ deserializedDescriptorResolver.setContext(deserializationGlobalContextForJava);
+ deserializedDescriptorResolver.setErrorReporter(traceBasedErrorReporter);
+
+ annotationDescriptorLoader.setClassResolver(javaDescriptorResolver);
+ annotationDescriptorLoader.setErrorReporter(traceBasedErrorReporter);
+ annotationDescriptorLoader.setKotlinClassFinder(virtualFileFinder);
+ annotationDescriptorLoader.setStorage(descriptorDeserializersStorage);
descriptorDeserializersStorage.setClassResolver(javaDescriptorResolver);
descriptorDeserializersStorage.setErrorReporter(traceBasedErrorReporter);
- constantDescriptorDeserializer.setClassResolver(javaDescriptorResolver);
- constantDescriptorDeserializer.setErrorReporter(traceBasedErrorReporter);
- constantDescriptorDeserializer.setKotlinClassFinder(virtualFileFinder);
- constantDescriptorDeserializer.setStorage(descriptorDeserializersStorage);
+ constantDescriptorLoader.setClassResolver(javaDescriptorResolver);
+ constantDescriptorLoader.setErrorReporter(traceBasedErrorReporter);
+ constantDescriptorLoader.setKotlinClassFinder(virtualFileFinder);
+ constantDescriptorLoader.setStorage(descriptorDeserializersStorage);
javaClassFinder.initialize();
@@ -362,8 +358,8 @@ public class InjectorForTopDownAnalyzerForJvm implements InjectorForTopDownAnaly
return this.javaDescriptorResolver;
}
- public DescriptorDeserializers getDescriptorDeserializers() {
- return this.descriptorDeserializers;
+ public DeserializationGlobalContextForJava getDeserializationGlobalContextForJava() {
+ return this.deserializationGlobalContextForJava;
}
}
diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java
index ea61a9122f4..21ec18286c0 100644
--- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java
+++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/AnalyzerFacadeForJVM.java
@@ -56,6 +56,7 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
public static final List DEFAULT_IMPORTS = ImmutableList.of(
new ImportPath("java.lang.*"),
new ImportPath("kotlin.*"),
+ new ImportPath("kotlin.jvm.*"),
new ImportPath("kotlin.io.*"),
new ImportPath("kotlin.reflect.*")
);
@@ -153,7 +154,7 @@ public enum AnalyzerFacadeForJVM implements AnalyzerFacade {
module.addFragmentProvider(
DependencyKind.SOURCES,
new IncrementalPackageFragmentProvider(
- files, module, globalContext.getStorageManager(), injector.getDescriptorDeserializers(),
+ files, module, globalContext.getStorageManager(), injector.getDeserializationGlobalContextForJava(),
incrementalCache, moduleId, injector.getJavaDescriptorResolver()
)
);
diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/PackagePartClassUtils.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/PackagePartClassUtils.java
index 4a2b18624f1..5d20f681968 100644
--- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/PackagePartClassUtils.java
+++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/PackagePartClassUtils.java
@@ -72,6 +72,6 @@ public class PackagePartClassUtils {
@NotNull
public static FqName getPackagePartFqName(@NotNull DeserializedCallableMemberDescriptor callable) {
FqName packageFqName = ((PackageFragmentDescriptor) callable.getContainingDeclaration()).getFqName();
- return packageFqName.child(BaseDescriptorDeserializer.getPackagePartClassName(callable));
+ return packageFqName.child(BaseDescriptorLoader.getPackagePartClassName(callable));
}
}
diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalPackageFragmentProvider.kt b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalPackageFragmentProvider.kt
index 28497a07128..f52d0c4d651 100644
--- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalPackageFragmentProvider.kt
+++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/kotlin/incremental/IncrementalPackageFragmentProvider.kt
@@ -27,7 +27,6 @@ import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptorImpl
import org.jetbrains.jet.lang.resolve.scopes.JetScope
import org.jetbrains.jet.storage.StorageManager
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope
-import org.jetbrains.jet.descriptors.serialization.descriptors.Deserializers
import org.jetbrains.jet.descriptors.serialization.DescriptorFinder
import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver
@@ -45,12 +44,13 @@ import org.jetbrains.jet.lang.resolve.kotlin.PackagePartClassUtils
import org.jetbrains.jet.descriptors.serialization.JavaProtoBuf
import org.jetbrains.jet.lang.resolve.java.JvmClassName
import org.jetbrains.jet.descriptors.serialization.PackageData
+import org.jetbrains.jet.lang.resolve.kotlin.DeserializationGlobalContextForJava
public class IncrementalPackageFragmentProvider(
sourceFiles: Collection,
val module: ModuleDescriptor,
val storageManager: StorageManager,
- val deserializers: Deserializers,
+ val deserializationContext: DeserializationGlobalContextForJava,
val incrementalCache: IncrementalCache,
val moduleId: String,
val javaDescriptorResolver: JavaDescriptorResolver
@@ -124,7 +124,7 @@ public class IncrementalPackageFragmentProvider(
}
private inner class IncrementalPackageScope(val packageData: PackageData) : DeserializedPackageMemberScope(
- storageManager, this@IncrementalPackageFragment, deserializers, descriptorFinder, packageData
+ this@IncrementalPackageFragment, packageData, deserializationContext
) {
override fun filteredMemberProtos(allMemberProtos: Collection): Collection {
return allMemberProtos
diff --git a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java
index 2b284bf45a6..0107ecd5373 100644
--- a/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java
+++ b/compiler/frontend/src/org/jetbrains/jet/di/InjectorForTopDownAnalyzerBasic.java
@@ -49,10 +49,10 @@ import org.jetbrains.jet.lang.resolve.ScriptBodyResolver;
import org.jetbrains.jet.lang.resolve.DeclarationResolver;
import org.jetbrains.jet.lang.resolve.ImportsResolver;
import org.jetbrains.jet.lang.psi.JetImportsFactory;
-import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver;
import org.jetbrains.jet.lang.resolve.OverloadResolver;
import org.jetbrains.jet.lang.resolve.OverrideResolver;
import org.jetbrains.jet.lang.resolve.TypeHierarchyResolver;
+import org.jetbrains.jet.lang.resolve.ScriptHeaderResolver;
import org.jetbrains.annotations.NotNull;
import javax.annotation.PreDestroy;
@@ -93,10 +93,10 @@ public class InjectorForTopDownAnalyzerBasic {
private final DeclarationResolver declarationResolver;
private final ImportsResolver importsResolver;
private final JetImportsFactory jetImportsFactory;
- private final ScriptHeaderResolver scriptHeaderResolver;
private final OverloadResolver overloadResolver;
private final OverrideResolver overrideResolver;
private final TypeHierarchyResolver typeHierarchyResolver;
+ private final ScriptHeaderResolver scriptHeaderResolver;
public InjectorForTopDownAnalyzerBasic(
@NotNull Project project,
@@ -137,10 +137,10 @@ public class InjectorForTopDownAnalyzerBasic {
this.declarationResolver = new DeclarationResolver();
this.importsResolver = new ImportsResolver();
this.jetImportsFactory = new JetImportsFactory();
- this.scriptHeaderResolver = new ScriptHeaderResolver();
this.overloadResolver = new OverloadResolver();
this.overrideResolver = new OverrideResolver();
this.typeHierarchyResolver = new TypeHierarchyResolver();
+ this.scriptHeaderResolver = new ScriptHeaderResolver();
this.topDownAnalyzer.setBodyResolver(bodyResolver);
this.topDownAnalyzer.setDeclarationResolver(declarationResolver);
@@ -232,7 +232,6 @@ public class InjectorForTopDownAnalyzerBasic {
declarationResolver.setAnnotationResolver(annotationResolver);
declarationResolver.setDescriptorResolver(descriptorResolver);
declarationResolver.setImportsResolver(importsResolver);
- declarationResolver.setScriptHeaderResolver(scriptHeaderResolver);
declarationResolver.setTrace(bindingTrace);
importsResolver.setImportsFactory(jetImportsFactory);
@@ -242,9 +241,6 @@ public class InjectorForTopDownAnalyzerBasic {
jetImportsFactory.setProject(project);
- scriptHeaderResolver.setPackageFragmentProvider(mutablePackageFragmentProvider);
- scriptHeaderResolver.setTrace(bindingTrace);
-
overloadResolver.setTrace(bindingTrace);
overrideResolver.setTrace(bindingTrace);
@@ -255,6 +251,9 @@ public class InjectorForTopDownAnalyzerBasic {
typeHierarchyResolver.setScriptHeaderResolver(scriptHeaderResolver);
typeHierarchyResolver.setTrace(bindingTrace);
+ scriptHeaderResolver.setPackageFragmentProvider(mutablePackageFragmentProvider);
+ scriptHeaderResolver.setTrace(bindingTrace);
+
}
@PreDestroy
diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetStubElementType.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetStubElementType.java
index 78e1885567b..cac012ab8a3 100644
--- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetStubElementType.java
+++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetStubElementType.java
@@ -93,7 +93,7 @@ public abstract class JetStubElementType {
public open override /*1*/ fun (): kotlin.Int
public open override /*1*/ val start: kotlin.Byte
public open override /*1*/ fun (): kotlin.Byte
+ public final fun isEmpty(): kotlin.Boolean
public open override /*1*/ fun iterator(): kotlin.ByteIterator
}
@@ -170,6 +171,7 @@ public final class ByteRange : kotlin.Range, kotlin.Progression(): kotlin.Byte
public open override /*1*/ fun contains(/*0*/ item: kotlin.Byte): kotlin.Boolean
+ public open override /*1*/ fun isEmpty(): kotlin.Boolean
public open override /*1*/ fun iterator(): kotlin.ByteIterator
public class object {
@@ -259,6 +261,7 @@ public final class CharProgression : kotlin.Progression {
public open override /*1*/ fun (): kotlin.Int
public open override /*1*/ val start: kotlin.Char
public open override /*1*/ fun (): kotlin.Char
+ public final fun isEmpty(): kotlin.Boolean
public open override /*1*/ fun iterator(): kotlin.CharIterator
}
@@ -288,6 +291,7 @@ public final class CharRange : kotlin.Range, kotlin.Progression(): kotlin.Char
public open override /*1*/ fun contains(/*0*/ item: kotlin.Char): kotlin.Boolean
+ public open override /*1*/ fun isEmpty(): kotlin.Boolean
public open override /*1*/ fun iterator(): kotlin.CharIterator
public class object {
@@ -404,6 +408,7 @@ public final class DoubleProgression : kotlin.Progression {
public open override /*1*/ fun (): kotlin.Double
public open override /*1*/ val start: kotlin.Double
public open override /*1*/ fun (): kotlin.Double
+ public final fun isEmpty(): kotlin.Boolean
public open override /*1*/ fun iterator(): kotlin.DoubleIterator
}
@@ -430,6 +435,7 @@ public final class DoubleRange : kotlin.Range, kotlin.Progression
public open override /*2*/ val start: kotlin.Double
public open override /*2*/ fun (): kotlin.Double
public open override /*1*/ fun contains(/*0*/ item: kotlin.Double): kotlin.Boolean
+ public open override /*1*/ fun isEmpty(): kotlin.Boolean
public open override /*1*/ fun iterator(): kotlin.DoubleIterator
public class object {
@@ -627,6 +633,7 @@ public final class FloatProgression : kotlin.Progression {
public open override /*1*/ fun (): kotlin.Float
public open override /*1*/ val start: kotlin.Float
public open override /*1*/ fun (): kotlin.Float
+ public final fun isEmpty(): kotlin.Boolean
public open override /*1*/ fun iterator(): kotlin.FloatIterator
}
@@ -653,6 +660,7 @@ public final class FloatRange : kotlin.Range, kotlin.Progression(): kotlin.Float
public open override /*1*/ fun contains(/*0*/ item: kotlin.Float): kotlin.Boolean
+ public open override /*1*/ fun isEmpty(): kotlin.Boolean
public open override /*1*/ fun iterator(): kotlin.FloatIterator
public class object {
@@ -887,6 +895,7 @@ public final class IntProgression : kotlin.Progression {
public open override /*1*/ fun (): kotlin.Int
public open override /*1*/ val start: kotlin.Int
public open override /*1*/ fun (): kotlin.Int
+ public final fun isEmpty(): kotlin.Boolean
public open override /*1*/ fun iterator(): kotlin.IntIterator
}
@@ -916,6 +925,7 @@ public final class IntRange : kotlin.Range, kotlin.Progression(): kotlin.Int
public open override /*1*/ fun contains(/*0*/ item: kotlin.Int): kotlin.Boolean
+ public open override /*1*/ fun isEmpty(): kotlin.Boolean
public open override /*1*/ fun iterator(): kotlin.IntIterator
public class object {
@@ -1054,6 +1064,7 @@ public final class LongProgression : kotlin.Progression {
public open override /*1*/ fun (): kotlin.Long
public open override /*1*/ val start: kotlin.Long
public open override /*1*/ fun (): kotlin.Long
+ public final fun isEmpty(): kotlin.Boolean
public open override /*1*/ fun iterator(): kotlin.LongIterator
}
@@ -1083,6 +1094,7 @@ public final class LongRange : kotlin.Range, kotlin.Progression(): kotlin.Long
public open override /*1*/ fun contains(/*0*/ item: kotlin.Long): kotlin.Boolean
+ public open override /*1*/ fun isEmpty(): kotlin.Boolean
public open override /*1*/ fun iterator(): kotlin.LongIterator
public class object {
@@ -1245,6 +1257,7 @@ public trait Range*0*/ T : kotlin.Comparable> {
public abstract val start: T
public abstract fun (): T
public abstract fun contains(/*0*/ item: T): kotlin.Boolean
+ public open fun isEmpty(): kotlin.Boolean
}
public trait Set*0*/ out E> : kotlin.Collection {
@@ -1345,6 +1358,7 @@ public final class ShortProgression : kotlin.Progression {
public open override /*1*/ fun (): kotlin.Int
public open override /*1*/ val start: kotlin.Short
public open override /*1*/ fun (): kotlin.Short
+ public final fun isEmpty(): kotlin.Boolean
public open override /*1*/ fun iterator(): kotlin.ShortIterator
}
@@ -1374,6 +1388,7 @@ public final class ShortRange : kotlin.Range, kotlin.Progression(): kotlin.Short
public open override /*1*/ fun contains(/*0*/ item: kotlin.Short): kotlin.Boolean
+ public open override /*1*/ fun isEmpty(): kotlin.Boolean
public open override /*1*/ fun iterator(): kotlin.ShortIterator
public class object {
diff --git a/compiler/testData/codegen/boxWithStdlib/annotations/jvmFlags.kt b/compiler/testData/codegen/boxWithStdlib/annotations/jvmFlags.kt
new file mode 100644
index 00000000000..1d3446a39f6
--- /dev/null
+++ b/compiler/testData/codegen/boxWithStdlib/annotations/jvmFlags.kt
@@ -0,0 +1,21 @@
+import java.lang.reflect.Modifier
+
+class C {
+ volatile var vol = 1
+ transient val tra = 1
+
+ strictfp fun str() {}
+ synchronized fun sync() {}
+}
+
+fun box(): String {
+ val c = javaClass()
+
+ if (c.getDeclaredField("vol").getModifiers() and Modifier.VOLATILE == 0) return "Fail: volatile"
+ if (c.getDeclaredField("tra").getModifiers() and Modifier.TRANSIENT == 0) return "Fail: transient"
+
+ if (c.getDeclaredMethod("str").getModifiers() and Modifier.STRICT == 0) return "Fail: strict"
+ if (c.getDeclaredMethod("sync").getModifiers() and Modifier.SYNCHRONIZED == 0) return "Fail: synchronized"
+
+ return "OK"
+}
diff --git a/compiler/testData/codegen/bytecodeText/noFlagAnnotations.kt b/compiler/testData/codegen/bytecodeText/noFlagAnnotations.kt
new file mode 100644
index 00000000000..3f143e7bfc1
--- /dev/null
+++ b/compiler/testData/codegen/bytecodeText/noFlagAnnotations.kt
@@ -0,0 +1,10 @@
+volatile var vol = 1
+transient val tra = 1
+
+strictfp fun str() {}
+synchronized fun sync() {}
+
+// 0 kotlin/jvm/volatile
+// 0 kotlin/jvm/transient
+// 0 kotlin/jvm/strictfp
+// 0 kotlin/jvm/synchronized
diff --git a/compiler/testData/codegen/bytecodeText/noVolatileAnnotation.kt b/compiler/testData/codegen/bytecodeText/noVolatileAnnotation.kt
deleted file mode 100644
index 11dc5d3f182..00000000000
--- a/compiler/testData/codegen/bytecodeText/noVolatileAnnotation.kt
+++ /dev/null
@@ -1,3 +0,0 @@
-volatile val foo: Int = 1
-
-// 0 kotlin/volatile
diff --git a/compiler/testData/loadJava/compiledJava/PrivateMembers.java b/compiler/testData/loadJava/compiledJava/PrivateMembers.java
new file mode 100644
index 00000000000..f02f5d4be6f
--- /dev/null
+++ b/compiler/testData/loadJava/compiledJava/PrivateMembers.java
@@ -0,0 +1,30 @@
+package test;
+
+public class PrivateMembers {
+ private PrivateMembers() {
+ }
+
+ private int field = 1;
+ private static int staticField = 2;
+
+ private void method() {
+ }
+
+ private void samAdapter(SamInterface r) {
+ }
+
+ private static void staticMethod() {
+ }
+
+ private class Inner {
+ }
+
+ private interface SamInterface {
+ void foo();
+ }
+
+ private static class Nested {
+ private static void staticMethodInNested() {
+ }
+ }
+}
diff --git a/compiler/testData/loadJava/compiledJava/PrivateMembers.txt b/compiler/testData/loadJava/compiledJava/PrivateMembers.txt
new file mode 100644
index 00000000000..4463db12d23
--- /dev/null
+++ b/compiler/testData/loadJava/compiledJava/PrivateMembers.txt
@@ -0,0 +1,31 @@
+package test
+
+public open class PrivateMembers : java.lang.Object {
+ private constructor PrivateMembers()
+ private final var field: kotlin.Int
+ private open fun method(): kotlin.Unit
+ private final /*synthesized*/ fun samAdapter(/*0*/ p0: (() -> kotlin.Unit)?): kotlin.Unit
+ private open fun samAdapter(/*0*/ p0: test.PrivateMembers.SamInterface?): kotlin.Unit
+
+ private open inner class Inner : java.lang.Object {
+ private constructor Inner()
+ }
+
+ private open class Nested : java.lang.Object {
+ private constructor Nested()
+ }
+
+ private trait SamInterface : java.lang.Object {
+ public abstract fun foo(): kotlin.Unit
+ }
+}
+
+package test.PrivateMembers {
+ private var staticField: kotlin.Int
+ private /*synthesized*/ fun SamInterface(/*0*/ function: () -> kotlin.Unit): test.PrivateMembers.SamInterface
+ private open fun staticMethod(): kotlin.Unit
+
+ package test.PrivateMembers.Nested {
+ private open fun staticMethodInNested(): kotlin.Unit
+ }
+}
diff --git a/compiler/testData/loadJava/compiledJava/PrivateMembersInHierarchy.java b/compiler/testData/loadJava/compiledJava/PrivateMembersInHierarchy.java
new file mode 100644
index 00000000000..c4530580042
--- /dev/null
+++ b/compiler/testData/loadJava/compiledJava/PrivateMembersInHierarchy.java
@@ -0,0 +1,19 @@
+package test;
+
+public class PrivateMembersInHierarchy {
+ public static class Super {
+ private int field = 1;
+ private int field2 = 1;
+
+ private void method() {
+ }
+ }
+
+ public static class Sub extends Super {
+ private int field = 1;
+
+ private void method() {
+ }
+ }
+}
+
diff --git a/compiler/testData/loadJava/compiledJava/PrivateMembersInHierarchy.txt b/compiler/testData/loadJava/compiledJava/PrivateMembersInHierarchy.txt
new file mode 100644
index 00000000000..7275997f1a3
--- /dev/null
+++ b/compiler/testData/loadJava/compiledJava/PrivateMembersInHierarchy.txt
@@ -0,0 +1,19 @@
+package test
+
+public open class PrivateMembersInHierarchy : java.lang.Object {
+ public constructor PrivateMembersInHierarchy()
+
+ public open class Sub : test.PrivateMembersInHierarchy.Super {
+ public constructor Sub()
+ private final var field: kotlin.Int
+ invisible_fake final override /*1*/ /*fake_override*/ var field2: kotlin.Int
+ private open fun method(): kotlin.Unit
+ }
+
+ public open class Super : java.lang.Object {
+ public constructor Super()
+ private final var field: kotlin.Int
+ private final var field2: kotlin.Int
+ private open fun method(): kotlin.Unit
+ }
+}
diff --git a/compiler/testData/loadJava/compiledJavaCompareWithKotlin/ClassDoesNotOverrideMethod.txt b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/ClassDoesNotOverrideMethod.txt
index 691a30890d3..8aa68a937e6 100644
--- a/compiler/testData/loadJava/compiledJavaCompareWithKotlin/ClassDoesNotOverrideMethod.txt
+++ b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/ClassDoesNotOverrideMethod.txt
@@ -2,9 +2,12 @@ package test
public abstract class ClassDoesNotOverrideMethod : java.util.Date {
public constructor ClassDoesNotOverrideMethod()
+ invisible_fake final override /*1*/ /*fake_override*/ var cdate: sun.util.calendar.BaseCalendar.Date?
+ invisible_fake final override /*1*/ /*fake_override*/ var fastTime: kotlin.Long
public open override /*1*/ /*fake_override*/ fun after(/*0*/ p0: java.util.Date): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun before(/*0*/ p0: java.util.Date): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: java.util.Date): kotlin.Int
+ invisible_fake final override /*1*/ /*fake_override*/ fun getCalendarDate(): sun.util.calendar.BaseCalendar.Date?
kotlin.deprecated(value = "Deprecated in Java": kotlin.String) public open override /*1*/ /*fake_override*/ fun getDate(): kotlin.Int
kotlin.deprecated(value = "Deprecated in Java": kotlin.String) public open override /*1*/ /*fake_override*/ fun getDay(): kotlin.Int
kotlin.deprecated(value = "Deprecated in Java": kotlin.String) public open override /*1*/ /*fake_override*/ fun getHours(): kotlin.Int
@@ -12,8 +15,12 @@ public abstract class ClassDoesNotOverrideMethod : java.util.Date {
kotlin.deprecated(value = "Deprecated in Java": kotlin.String) public open override /*1*/ /*fake_override*/ fun getMonth(): kotlin.Int
kotlin.deprecated(value = "Deprecated in Java": kotlin.String) public open override /*1*/ /*fake_override*/ fun getSeconds(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun getTime(): kotlin.Long
+ invisible_fake final override /*1*/ /*fake_override*/ fun getTimeImpl(): kotlin.Long
kotlin.deprecated(value = "Deprecated in Java": kotlin.String) public open override /*1*/ /*fake_override*/ fun getTimezoneOffset(): kotlin.Int
kotlin.deprecated(value = "Deprecated in Java": kotlin.String) public open override /*1*/ /*fake_override*/ fun getYear(): kotlin.Int
+ invisible_fake final override /*1*/ /*fake_override*/ fun normalize(): sun.util.calendar.BaseCalendar.Date?
+ invisible_fake final override /*1*/ /*fake_override*/ fun normalize(/*0*/ p0: sun.util.calendar.BaseCalendar.Date?): sun.util.calendar.BaseCalendar.Date?
+ invisible_fake open override /*1*/ /*fake_override*/ fun readObject(/*0*/ p0: java.io.ObjectInputStream?): kotlin.Unit
kotlin.deprecated(value = "Deprecated in Java": kotlin.String) public open override /*1*/ /*fake_override*/ fun setDate(/*0*/ p0: kotlin.Int): kotlin.Unit
kotlin.deprecated(value = "Deprecated in Java": kotlin.String) public open override /*1*/ /*fake_override*/ fun setHours(/*0*/ p0: kotlin.Int): kotlin.Unit
kotlin.deprecated(value = "Deprecated in Java": kotlin.String) public open override /*1*/ /*fake_override*/ fun setMinutes(/*0*/ p0: kotlin.Int): kotlin.Unit
@@ -23,4 +30,5 @@ public abstract class ClassDoesNotOverrideMethod : java.util.Date {
kotlin.deprecated(value = "Deprecated in Java": kotlin.String) public open override /*1*/ /*fake_override*/ fun setYear(/*0*/ p0: kotlin.Int): kotlin.Unit
kotlin.deprecated(value = "Deprecated in Java": kotlin.String) public open override /*1*/ /*fake_override*/ fun toGMTString(): kotlin.String
kotlin.deprecated(value = "Deprecated in Java": kotlin.String) public open override /*1*/ /*fake_override*/ fun toLocaleString(): kotlin.String
+ invisible_fake open override /*1*/ /*fake_override*/ fun writeObject(/*0*/ p0: java.io.ObjectOutputStream?): kotlin.Unit
}
diff --git a/compiler/testData/loadJava/compiledJavaCompareWithKotlin/modality/ModalityOfFakeOverrides.txt b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/modality/ModalityOfFakeOverrides.txt
index 9463b8db02f..bfa2d292f29 100644
--- a/compiler/testData/loadJava/compiledJavaCompareWithKotlin/modality/ModalityOfFakeOverrides.txt
+++ b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/modality/ModalityOfFakeOverrides.txt
@@ -17,6 +17,8 @@ public open class ModalityOfFakeOverrides : java.util.AbstractList
public open override /*1*/ /*fake_override*/ fun listIterator(/*0*/ index: kotlin.Int): kotlin.MutableListIterator
+ invisible_fake open override /*1*/ /*fake_override*/ fun outOfBoundsMsg(/*0*/ p0: kotlin.Int): kotlin.String?
+ invisible_fake open override /*1*/ /*fake_override*/ fun rangeCheckForAdd(/*0*/ p0: kotlin.Int): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun remove(/*0*/ o: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun remove(/*0*/ index: kotlin.Int): kotlin.String
public open override /*1*/ /*fake_override*/ fun removeAll(/*0*/ c: kotlin.Collection): kotlin.Boolean
diff --git a/compiler/testData/loadJava/compiledKotlin/visibility/PrivateClassMembers.kt b/compiler/testData/loadJava/compiledKotlin/visibility/PrivateClassMembers.kt
new file mode 100644
index 00000000000..8a4a19cd3d9
--- /dev/null
+++ b/compiler/testData/loadJava/compiledKotlin/visibility/PrivateClassMembers.kt
@@ -0,0 +1,14 @@
+//ALLOW_AST_ACCESS
+
+package test
+
+public class PrivateClassMembers {
+ private val v = 0
+
+ private var r = 0
+ private set
+
+ private fun f() = 0
+
+ internal val internal = 0
+}
diff --git a/compiler/testData/loadJava/compiledKotlin/visibility/PrivateClassMembers.txt b/compiler/testData/loadJava/compiledKotlin/visibility/PrivateClassMembers.txt
new file mode 100644
index 00000000000..a47d068548b
--- /dev/null
+++ b/compiler/testData/loadJava/compiledKotlin/visibility/PrivateClassMembers.txt
@@ -0,0 +1,13 @@
+package test
+
+public final class PrivateClassMembers {
+ /*primary*/ public constructor PrivateClassMembers()
+ internal final val internal: kotlin.Int = 0
+ internal final fun (): kotlin.Int
+ private final var r: kotlin.Int
+ private final fun (): kotlin.Int
+ private final fun (/*0*/ : kotlin.Int): kotlin.Unit
+ private final val v: kotlin.Int = 0
+ private final fun (): kotlin.Int
+ private final fun f(): kotlin.Int
+}
diff --git a/compiler/testData/loadJava/kotlinAgainstCompiledJavaWithKotlin/InheritJavaField.kt b/compiler/testData/loadJava/kotlinAgainstCompiledJavaWithKotlin/InheritJavaField.kt
new file mode 100644
index 00000000000..0ff5452763a
--- /dev/null
+++ b/compiler/testData/loadJava/kotlinAgainstCompiledJavaWithKotlin/InheritJavaField.kt
@@ -0,0 +1,4 @@
+package test
+
+public class InheritJavaField(): Super() {
+}
diff --git a/compiler/testData/loadJava/kotlinAgainstCompiledJavaWithKotlin/InheritJavaField.txt b/compiler/testData/loadJava/kotlinAgainstCompiledJavaWithKotlin/InheritJavaField.txt
new file mode 100644
index 00000000000..25d9f3762b8
--- /dev/null
+++ b/compiler/testData/loadJava/kotlinAgainstCompiledJavaWithKotlin/InheritJavaField.txt
@@ -0,0 +1,15 @@
+package test
+
+public final class InheritJavaField : test.Super {
+ public constructor InheritJavaField()
+ public final override /*1*/ /*fake_override*/ var field: kotlin.Int
+ invisible_fake final override /*1*/ /*fake_override*/ var privateField: kotlin.Int
+ public open override /*1*/ /*fake_override*/ fun method(): kotlin.Int
+}
+
+public open class Super : java.lang.Object {
+ public constructor Super()
+ public final var field: kotlin.Int
+ private final var privateField: kotlin.Int
+ public open fun method(): kotlin.Int
+}
diff --git a/compiler/testData/loadJava/kotlinAgainstCompiledJavaWithKotlin/InheritJavaField/Super.java b/compiler/testData/loadJava/kotlinAgainstCompiledJavaWithKotlin/InheritJavaField/Super.java
new file mode 100644
index 00000000000..a6427c5fdd0
--- /dev/null
+++ b/compiler/testData/loadJava/kotlinAgainstCompiledJavaWithKotlin/InheritJavaField/Super.java
@@ -0,0 +1,7 @@
+package test;
+
+public class Super {
+ public int field = 55;
+ private int privateField = 54;
+ public int method() { return 1; }
+}
diff --git a/compiler/testData/mockJDK/jre/lib/rt.jar b/compiler/testData/mockJDK/jre/lib/rt.jar
index 612d76c1482..bc09a129fae 100644
Binary files a/compiler/testData/mockJDK/jre/lib/rt.jar and b/compiler/testData/mockJDK/jre/lib/rt.jar differ
diff --git a/compiler/testData/mockJDK/src.zip b/compiler/testData/mockJDK/src.zip
index 7acc804630b..0a1d6b2634d 100644
Binary files a/compiler/testData/mockJDK/src.zip and b/compiler/testData/mockJDK/src.zip differ
diff --git a/compiler/testData/psi/BackslashInString.kt b/compiler/testData/psi/BackslashInString.kt
new file mode 100644
index 00000000000..b39bb2c32b5
--- /dev/null
+++ b/compiler/testData/psi/BackslashInString.kt
@@ -0,0 +1,3 @@
+fun foo() {
+ "\
+}
diff --git a/compiler/testData/psi/BackslashInString.txt b/compiler/testData/psi/BackslashInString.txt
new file mode 100644
index 00000000000..b4530baaa1d
--- /dev/null
+++ b/compiler/testData/psi/BackslashInString.txt
@@ -0,0 +1,22 @@
+JetFile: BackslashInString.kt
+ PACKAGE_DIRECTIVE
+
+ FUN
+ PsiElement(fun)('fun')
+ PsiWhiteSpace(' ')
+ PsiElement(IDENTIFIER)('foo')
+ VALUE_PARAMETER_LIST
+ PsiElement(LPAR)('(')
+ PsiElement(RPAR)(')')
+ PsiWhiteSpace(' ')
+ BLOCK
+ PsiElement(LBRACE)('{')
+ PsiWhiteSpace('\n ')
+ STRING_TEMPLATE
+ PsiElement(OPEN_QUOTE)('"')
+ PsiErrorElement:Unexpected token in a string template
+ PsiElement(BAD_CHARACTER)('\')
+ PsiErrorElement:Expecting '"'
+
+ PsiWhiteSpace('\n')
+ PsiElement(RBRACE)('}')
diff --git a/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java
index 5bda0c1b766..269eef9a9de 100644
--- a/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java
+++ b/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java
@@ -122,9 +122,9 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest {
doTest("compiler/testData/codegen/bytecodeText/kt5016intOrNull.kt");
}
- @TestMetadata("noVolatileAnnotation.kt")
- public void testNoVolatileAnnotation() throws Exception {
- doTest("compiler/testData/codegen/bytecodeText/noVolatileAnnotation.kt");
+ @TestMetadata("noFlagAnnotations.kt")
+ public void testNoFlagAnnotations() throws Exception {
+ doTest("compiler/testData/codegen/bytecodeText/noFlagAnnotations.kt");
}
@TestMetadata("noWrapperForMethodReturningPrimitive.kt")
diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java
index 3e17574daba..840c767b4fd 100644
--- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java
+++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java
@@ -48,6 +48,11 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode
doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/annotations/defaultParameterValues.kt");
}
+ @TestMetadata("jvmFlags.kt")
+ public void testJvmFlags() throws Exception {
+ doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/annotations/jvmFlags.kt");
+ }
+
@TestMetadata("kotlinPropertyFromClassObjectAsParameter.kt")
public void testKotlinPropertyFromClassObjectAsParameter() throws Exception {
doTestWithStdlib("compiler/testData/codegen/boxWithStdlib/annotations/kotlinPropertyFromClassObjectAsParameter.kt");
diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java
index ee863c05b7d..4f20fb8b50a 100644
--- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java
+++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java
@@ -64,6 +64,16 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest {
doTestCompiledJava("compiler/testData/loadJava/compiledJava/PackageLocalVisibility.java");
}
+ @TestMetadata("PrivateMembers.java")
+ public void testPrivateMembers() throws Exception {
+ doTestCompiledJava("compiler/testData/loadJava/compiledJava/PrivateMembers.java");
+ }
+
+ @TestMetadata("PrivateMembersInHierarchy.java")
+ public void testPrivateMembersInHierarchy() throws Exception {
+ doTestCompiledJava("compiler/testData/loadJava/compiledJava/PrivateMembersInHierarchy.java");
+ }
+
@TestMetadata("RawTypeWithUpperBound.java")
public void testRawTypeWithUpperBound() throws Exception {
doTestCompiledJava("compiler/testData/loadJava/compiledJava/RawTypeWithUpperBound.java");
@@ -2978,6 +2988,11 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest {
doTestCompiledKotlin("compiler/testData/loadJava/compiledKotlin/visibility/PrivateClass.kt");
}
+ @TestMetadata("PrivateClassMembers.kt")
+ public void testPrivateClassMembers() throws Exception {
+ doTestCompiledKotlin("compiler/testData/loadJava/compiledKotlin/visibility/PrivateClassMembers.kt");
+ }
+
@TestMetadata("PrivateTopLevelFun.kt")
public void testPrivateTopLevelFun() throws Exception {
doTestCompiledKotlin("compiler/testData/loadJava/compiledKotlin/visibility/PrivateTopLevelFun.kt");
@@ -3167,6 +3182,11 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("compiler/testData/loadJava/kotlinAgainstCompiledJavaWithKotlin"), Pattern.compile("^(.+)\\.kt$"), false);
}
+ @TestMetadata("InheritJavaField.kt")
+ public void testInheritJavaField() throws Exception {
+ doTestKotlinAgainstCompiledJavaWithKotlin("compiler/testData/loadJava/kotlinAgainstCompiledJavaWithKotlin/InheritJavaField.kt");
+ }
+
@TestMetadata("InheritParameterName.kt")
public void testInheritParameterName() throws Exception {
doTestKotlinAgainstCompiledJavaWithKotlin("compiler/testData/loadJava/kotlinAgainstCompiledJavaWithKotlin/InheritParameterName.kt");
diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveRecursiveComparingTestGenerated.java b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveRecursiveComparingTestGenerated.java
index 3196853ceab..9ef982632ec 100644
--- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveRecursiveComparingTestGenerated.java
+++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveRecursiveComparingTestGenerated.java
@@ -1456,6 +1456,11 @@ public class LazyResolveRecursiveComparingTestGenerated extends AbstractLazyReso
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/visibility/PrivateClass.kt");
}
+ @TestMetadata("PrivateClassMembers.kt")
+ public void testPrivateClassMembers() throws Exception {
+ doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/visibility/PrivateClassMembers.kt");
+ }
+
@TestMetadata("PrivateTopLevelFun.kt")
public void testPrivateTopLevelFun() throws Exception {
doTestCheckingPrimaryConstructorsAndAccessors("compiler/testData/loadJava/compiledKotlin/visibility/PrivateTopLevelFun.kt");
diff --git a/compiler/tests/org/jetbrains/jet/parsing/JetParsingTestGenerated.java b/compiler/tests/org/jetbrains/jet/parsing/JetParsingTestGenerated.java
index b170b9bcb3c..5354505a960 100644
--- a/compiler/tests/org/jetbrains/jet/parsing/JetParsingTestGenerated.java
+++ b/compiler/tests/org/jetbrains/jet/parsing/JetParsingTestGenerated.java
@@ -84,6 +84,11 @@ public class JetParsingTestGenerated extends AbstractJetParsingTest {
doParsingTest("compiler/testData/psi/BabySteps_ERR.kt");
}
+ @TestMetadata("BackslashInString.kt")
+ public void testBackslashInString() throws Exception {
+ doParsingTest("compiler/testData/psi/BackslashInString.kt");
+ }
+
@TestMetadata("BlockCommentAtBeginningOfFile1.kt")
public void testBlockCommentAtBeginningOfFile1() throws Exception {
doParsingTest("compiler/testData/psi/BlockCommentAtBeginningOfFile1.kt");
diff --git a/core/builtins/src/kotlin/Progressions.kt b/core/builtins/src/kotlin/Progressions.kt
index 774dadb1a9e..4d35c7ea78a 100644
--- a/core/builtins/src/kotlin/Progressions.kt
+++ b/core/builtins/src/kotlin/Progressions.kt
@@ -29,10 +29,14 @@ public class ByteProgression(
override fun iterator(): ByteIterator = ByteProgressionIterator(start, end, increment)
- override fun equals(other: Any?): Boolean =
- other is ByteProgression && start == other.start && end == other.end && increment == other.increment
+ public fun isEmpty(): Boolean = if (increment > 0) start > end else start < end
- override fun hashCode(): Int = 31 * (31 * start.toInt() + end) + increment
+ override fun equals(other: Any?): Boolean =
+ other is ByteProgression && (isEmpty() && other.isEmpty() ||
+ start == other.start && end == other.end && increment == other.increment)
+
+ override fun hashCode(): Int =
+ if (isEmpty()) -1 else (31 * (31 * start.toInt() + end) + increment)
override fun toString(): String = if (increment > 0) "$start..$end step $increment" else "$start downTo $end step ${-increment}"
}
@@ -48,10 +52,14 @@ public class CharProgression(
override fun iterator(): CharIterator = CharProgressionIterator(start, end, increment)
- override fun equals(other: Any?): Boolean =
- other is CharProgression && start == other.start && end == other.end && increment == other.increment
+ public fun isEmpty(): Boolean = if (increment > 0) start > end else start < end
- override fun hashCode(): Int = 31 * (31 * start.toInt() + end) + increment
+ override fun equals(other: Any?): Boolean =
+ other is CharProgression && (isEmpty() && other.isEmpty() ||
+ start == other.start && end == other.end && increment == other.increment)
+
+ override fun hashCode(): Int =
+ if (isEmpty()) -1 else (31 * (31 * start.toInt() + end) + increment)
override fun toString(): String = if (increment > 0) "$start..$end step $increment" else "$start downTo $end step ${-increment}"
}
@@ -67,10 +75,14 @@ public class ShortProgression(
override fun iterator(): ShortIterator = ShortProgressionIterator(start, end, increment)
- override fun equals(other: Any?): Boolean =
- other is ShortProgression && start == other.start && end == other.end && increment == other.increment
+ public fun isEmpty(): Boolean = if (increment > 0) start > end else start < end
- override fun hashCode(): Int = 31 * (31 * start.toInt() + end) + increment
+ override fun equals(other: Any?): Boolean =
+ other is ShortProgression && (isEmpty() && other.isEmpty() ||
+ start == other.start && end == other.end && increment == other.increment)
+
+ override fun hashCode(): Int =
+ if (isEmpty()) -1 else (31 * (31 * start.toInt() + end) + increment)
override fun toString(): String = if (increment > 0) "$start..$end step $increment" else "$start downTo $end step ${-increment}"
}
@@ -86,10 +98,14 @@ public class IntProgression(
override fun iterator(): IntIterator = IntProgressionIterator(start, end, increment)
- override fun equals(other: Any?): Boolean =
- other is IntProgression && start == other.start && end == other.end && increment == other.increment
+ public fun isEmpty(): Boolean = if (increment > 0) start > end else start < end
- override fun hashCode(): Int = 31 * (31 * start + end) + increment
+ override fun equals(other: Any?): Boolean =
+ other is IntProgression && (isEmpty() && other.isEmpty() ||
+ start == other.start && end == other.end && increment == other.increment)
+
+ override fun hashCode(): Int =
+ if (isEmpty()) -1 else (31 * (31 * start + end) + increment)
override fun toString(): String = if (increment > 0) "$start..$end step $increment" else "$start downTo $end step ${-increment}"
}
@@ -105,10 +121,14 @@ public class LongProgression(
override fun iterator(): LongIterator = LongProgressionIterator(start, end, increment)
- override fun equals(other: Any?): Boolean =
- other is LongProgression && start == other.start && end == other.end && increment == other.increment
+ public fun isEmpty(): Boolean = if (increment > 0) start > end else start < end
- override fun hashCode(): Int = (31 * (31 * (start xor (start ushr 32)) + (end xor (end ushr 32))) + (increment xor (increment ushr 32))).toInt()
+ override fun equals(other: Any?): Boolean =
+ other is LongProgression && (isEmpty() && other.isEmpty() ||
+ start == other.start && end == other.end && increment == other.increment)
+
+ override fun hashCode(): Int =
+ if (isEmpty()) -1 else (31 * (31 * (start xor (start ushr 32)) + (end xor (end ushr 32))) + (increment xor (increment ushr 32))).toInt()
override fun toString(): String = if (increment > 0) "$start..$end step $increment" else "$start downTo $end step ${-increment}"
}
@@ -125,10 +145,14 @@ public class FloatProgression(
override fun iterator(): FloatIterator = FloatProgressionIterator(start, end, increment)
- override fun equals(other: Any?): Boolean =
- other is FloatProgression && java.lang.Float.compare(start, other.start) == 0 && java.lang.Float.compare(end, other.end) == 0 && java.lang.Float.compare(increment, other.increment) == 0
+ public fun isEmpty(): Boolean = if (increment > 0) start > end else start < end
- override fun hashCode(): Int = 31 * (31 * java.lang.Float.floatToIntBits(start) + java.lang.Float.floatToIntBits(end)) + java.lang.Float.floatToIntBits(increment)
+ override fun equals(other: Any?): Boolean =
+ other is FloatProgression && (isEmpty() && other.isEmpty() ||
+ java.lang.Float.compare(start, other.start) == 0 && java.lang.Float.compare(end, other.end) == 0 && java.lang.Float.compare(increment, other.increment) == 0)
+
+ override fun hashCode(): Int =
+ if (isEmpty()) -1 else (31 * (31 * java.lang.Float.floatToIntBits(start) + java.lang.Float.floatToIntBits(end)) + java.lang.Float.floatToIntBits(increment))
override fun toString(): String = if (increment > 0) "$start..$end step $increment" else "$start downTo $end step ${-increment}"
}
@@ -145,10 +169,14 @@ public class DoubleProgression(
override fun iterator(): DoubleIterator = DoubleProgressionIterator(start, end, increment)
+ public fun isEmpty(): Boolean = if (increment > 0) start > end else start < end
+
override fun equals(other: Any?): Boolean =
- other is DoubleProgression && java.lang.Double.compare(start, other.start) == 0 && java.lang.Double.compare(end, other.end) == 0 && java.lang.Double.compare(increment, other.increment) == 0
+ other is DoubleProgression && (isEmpty() && other.isEmpty() ||
+ java.lang.Double.compare(start, other.start) == 0 && java.lang.Double.compare(end, other.end) == 0 && java.lang.Double.compare(increment, other.increment) == 0)
override fun hashCode(): Int {
+ if (isEmpty()) return -1
var temp = java.lang.Double.doubleToLongBits(start)
var result = (temp xor (temp ushr 32))
temp = java.lang.Double.doubleToLongBits(end)
diff --git a/core/builtins/src/kotlin/Range.kt b/core/builtins/src/kotlin/Range.kt
index eae8bbab1d7..b70be49d4e8 100644
--- a/core/builtins/src/kotlin/Range.kt
+++ b/core/builtins/src/kotlin/Range.kt
@@ -23,5 +23,7 @@ public trait Range> {
public fun contains(item: T): Boolean
+ public fun isEmpty(): Boolean = start > end
+
override fun toString(): String = "$start..$end"
}
diff --git a/core/builtins/src/kotlin/Ranges.kt b/core/builtins/src/kotlin/Ranges.kt
index ebd9574cc62..eec2e24f6c8 100644
--- a/core/builtins/src/kotlin/Ranges.kt
+++ b/core/builtins/src/kotlin/Ranges.kt
@@ -26,10 +26,14 @@ public class ByteRange(public override val start: Byte, public override val end:
override fun iterator(): ByteIterator = ByteProgressionIterator(start, end, 1)
- override fun equals(other: Any?): Boolean =
- other is ByteRange && start == other.start && end == other.end
+ override fun isEmpty(): Boolean = start > end
- override fun hashCode(): Int = 31 * start.toInt() + end
+ override fun equals(other: Any?): Boolean =
+ other is ByteRange && (isEmpty() && other.isEmpty() ||
+ start == other.start && end == other.end)
+
+ override fun hashCode(): Int =
+ if (isEmpty()) -1 else (31 * start.toInt() + end)
class object {
public val EMPTY: ByteRange = ByteRange(1, 0)
@@ -44,10 +48,14 @@ public class CharRange(public override val start: Char, public override val end:
override fun iterator(): CharIterator = CharProgressionIterator(start, end, 1)
- override fun equals(other: Any?): Boolean =
- other is CharRange && start == other.start && end == other.end
+ override fun isEmpty(): Boolean = start > end
- override fun hashCode(): Int = 31 * start.toInt() + end
+ override fun equals(other: Any?): Boolean =
+ other is CharRange && (isEmpty() && other.isEmpty() ||
+ start == other.start && end == other.end)
+
+ override fun hashCode(): Int =
+ if (isEmpty()) -1 else (31 * start.toInt() + end)
class object {
public val EMPTY: CharRange = CharRange(1.toChar(), 0.toChar())
@@ -62,10 +70,14 @@ public class ShortRange(public override val start: Short, public override val en
override fun iterator(): ShortIterator = ShortProgressionIterator(start, end, 1)
- override fun equals(other: Any?): Boolean =
- other is ShortRange && start == other.start && end == other.end
+ override fun isEmpty(): Boolean = start > end
- override fun hashCode(): Int = 31 * start.toInt() + end
+ override fun equals(other: Any?): Boolean =
+ other is ShortRange && (isEmpty() && other.isEmpty() ||
+ start == other.start && end == other.end)
+
+ override fun hashCode(): Int =
+ if (isEmpty()) -1 else (31 * start.toInt() + end)
class object {
public val EMPTY: ShortRange = ShortRange(1, 0)
@@ -80,10 +92,14 @@ public class IntRange(public override val start: Int, public override val end: I
override fun iterator(): IntIterator = IntProgressionIterator(start, end, 1)
- override fun equals(other: Any?): Boolean =
- other is IntRange && start == other.start && end == other.end
+ override fun isEmpty(): Boolean = start > end
- override fun hashCode(): Int = 31 * start + end
+ override fun equals(other: Any?): Boolean =
+ other is IntRange && (isEmpty() && other.isEmpty() ||
+ start == other.start && end == other.end)
+
+ override fun hashCode(): Int =
+ if (isEmpty()) -1 else (31 * start + end)
class object {
public val EMPTY: IntRange = IntRange(1, 0)
@@ -98,10 +114,14 @@ public class LongRange(public override val start: Long, public override val end:
override fun iterator(): LongIterator = LongProgressionIterator(start, end, 1)
- override fun equals(other: Any?): Boolean =
- other is LongRange && start == other.start && end == other.end
+ override fun isEmpty(): Boolean = start > end
- override fun hashCode(): Int = (31 * (start xor (start ushr 32)) + (end xor (end ushr 32))).toInt()
+ override fun equals(other: Any?): Boolean =
+ other is LongRange && (isEmpty() && other.isEmpty() ||
+ start == other.start && end == other.end)
+
+ override fun hashCode(): Int =
+ if (isEmpty()) -1 else (31 * (start xor (start ushr 32)) + (end xor (end ushr 32))).toInt()
class object {
public val EMPTY: LongRange = LongRange(1, 0)
@@ -116,10 +136,14 @@ public class FloatRange(public override val start: Float, public override val en
override fun iterator(): FloatIterator = FloatProgressionIterator(start, end, 1.0f)
- override fun equals(other: Any?): Boolean =
- other is FloatRange && java.lang.Float.compare(start, other.start) == 0 && java.lang.Float.compare(end, other.end) == 0
+ override fun isEmpty(): Boolean = start > end
- override fun hashCode(): Int = 31 * java.lang.Float.floatToIntBits(start) + java.lang.Float.floatToIntBits(end)
+ override fun equals(other: Any?): Boolean =
+ other is FloatRange && (isEmpty() && other.isEmpty() ||
+ java.lang.Float.compare(start, other.start) == 0 && java.lang.Float.compare(end, other.end) == 0)
+
+ override fun hashCode(): Int =
+ if (isEmpty()) -1 else (31 * java.lang.Float.floatToIntBits(start) + java.lang.Float.floatToIntBits(end))
class object {
public val EMPTY: FloatRange = FloatRange(1.0f, 0.0f)
@@ -134,10 +158,14 @@ public class DoubleRange(public override val start: Double, public override val
override fun iterator(): DoubleIterator = DoubleProgressionIterator(start, end, 1.0)
+ override fun isEmpty(): Boolean = start > end
+
override fun equals(other: Any?): Boolean =
- other is DoubleRange && java.lang.Double.compare(start, other.start) == 0 && java.lang.Double.compare(end, other.end) == 0
+ other is DoubleRange && (isEmpty() && other.isEmpty() ||
+ java.lang.Double.compare(start, other.start) == 0 && java.lang.Double.compare(end, other.end) == 0)
override fun hashCode(): Int {
+ if (isEmpty()) return -1
var temp = java.lang.Double.doubleToLongBits(start)
val result = (temp xor (temp ushr 32))
temp = java.lang.Double.doubleToLongBits(end)
diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/MemberIndex.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/MemberIndex.kt
index c76ce7ab31a..5bcae7e64b2 100644
--- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/MemberIndex.kt
+++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/lazy/descriptors/MemberIndex.kt
@@ -41,13 +41,7 @@ object EMPTY_MEMBER_INDEX : MemberIndex {
override fun getAllFieldNames() = listOf()
}
-open class ClassMemberIndex(val jClass: JavaClass, filter: (JavaMember) -> Boolean) : MemberIndex {
- private val memberFilter = {
- (m: JavaMember) ->
- filter(m) &&
- m.getVisibility() != Visibilities.PRIVATE
- }
-
+open class ClassMemberIndex(val jClass: JavaClass, val memberFilter: (JavaMember) -> Boolean) : MemberIndex {
private val methodFilter = {
(m: JavaMethod) ->
memberFilter(m) &&
diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/AnnotationDescriptorDeserializer.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/AnnotationDescriptorLoader.java
similarity index 97%
rename from core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/AnnotationDescriptorDeserializer.java
rename to core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/AnnotationDescriptorLoader.java
index d7d0c547e04..bbdb2d45c07 100644
--- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/AnnotationDescriptorDeserializer.java
+++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/AnnotationDescriptorLoader.java
@@ -21,7 +21,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.descriptors.serialization.JavaProtoBuf;
import org.jetbrains.jet.descriptors.serialization.NameResolver;
import org.jetbrains.jet.descriptors.serialization.ProtoBuf;
-import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationDeserializer;
+import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationLoader;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptorImpl;
@@ -46,10 +46,10 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import static org.jetbrains.jet.descriptors.serialization.descriptors.Deserializers.AnnotatedCallableKind;
+import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotatedCallableKind;
import static org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage.MemberSignature;
-public class AnnotationDescriptorDeserializer extends BaseDescriptorDeserializer implements AnnotationDeserializer {
+public class AnnotationDescriptorLoader extends BaseDescriptorLoader implements AnnotationLoader {
@Inject
@Override
public void setStorage(@NotNull DescriptorDeserializersStorage storage) {
diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/BaseDescriptorDeserializer.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/BaseDescriptorLoader.java
similarity index 98%
rename from core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/BaseDescriptorDeserializer.java
rename to core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/BaseDescriptorLoader.java
index 2bd12420109..c0f2e5b332e 100644
--- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/BaseDescriptorDeserializer.java
+++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/BaseDescriptorLoader.java
@@ -31,14 +31,14 @@ import org.jetbrains.jet.lang.resolve.java.resolver.ErrorReporter;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolver;
-import static org.jetbrains.jet.descriptors.serialization.descriptors.Deserializers.AnnotatedCallableKind;
+import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotatedCallableKind;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isClassObject;
import static org.jetbrains.jet.lang.resolve.DescriptorUtils.isTrait;
import static org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage.MemberSignature;
import static org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.kotlinFqNameToJavaFqName;
import static org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.naiveKotlinFqName;
-public abstract class BaseDescriptorDeserializer {
+public abstract class BaseDescriptorLoader {
protected DependencyClassByQualifiedNameResolver classResolver;
protected KotlinClassFinder kotlinClassFinder;
protected ErrorReporter errorReporter;
diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/ConstantDescriptorDeserializer.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/ConstantDescriptorLoader.java
similarity index 92%
rename from core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/ConstantDescriptorDeserializer.java
rename to core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/ConstantDescriptorLoader.java
index 0f240a14531..22d203ba035 100644
--- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/ConstantDescriptorDeserializer.java
+++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/ConstantDescriptorLoader.java
@@ -20,7 +20,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.descriptors.serialization.NameResolver;
import org.jetbrains.jet.descriptors.serialization.ProtoBuf;
-import org.jetbrains.jet.descriptors.serialization.descriptors.ConstantDeserializer;
+import org.jetbrains.jet.descriptors.serialization.descriptors.ConstantLoader;
import org.jetbrains.jet.lang.descriptors.ClassOrPackageFragmentDescriptor;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.resolve.java.resolver.ErrorReporter;
@@ -28,10 +28,10 @@ import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolver;
import javax.inject.Inject;
-import static org.jetbrains.jet.descriptors.serialization.descriptors.Deserializers.AnnotatedCallableKind;
+import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotatedCallableKind;
import static org.jetbrains.jet.lang.resolve.kotlin.DescriptorDeserializersStorage.MemberSignature;
-public class ConstantDescriptorDeserializer extends BaseDescriptorDeserializer implements ConstantDeserializer {
+public class ConstantDescriptorLoader extends BaseDescriptorLoader implements ConstantLoader {
@Inject
@Override
public void setStorage(@NotNull DescriptorDeserializersStorage storage) {
diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DescriptorDeserializers.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DescriptorDeserializers.java
deleted file mode 100644
index eec84302c3d..00000000000
--- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DescriptorDeserializers.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.lang.resolve.kotlin;
-
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationDeserializer;
-import org.jetbrains.jet.descriptors.serialization.descriptors.ConstantDeserializer;
-import org.jetbrains.jet.descriptors.serialization.descriptors.Deserializers;
-
-import javax.inject.Inject;
-
-public class DescriptorDeserializers implements Deserializers {
-
- private AnnotationDescriptorDeserializer annotationDescriptorDeserializer;
- private ConstantDescriptorDeserializer constantDescriptorDeserializer;
-
- @Inject
- public void setAnnotationDescriptorDeserializer(AnnotationDescriptorDeserializer annotationDescriptorDeserializer) {
- this.annotationDescriptorDeserializer = annotationDescriptorDeserializer;
- }
-
- @Inject
- public void setConstantDescriptorDeserializer(ConstantDescriptorDeserializer constantDescriptorDeserializer) {
- this.constantDescriptorDeserializer = constantDescriptorDeserializer;
- }
-
- @NotNull
- @Override
- public AnnotationDeserializer getAnnotationDeserializer() {
- return annotationDescriptorDeserializer;
- }
-
- @NotNull
- @Override
- public ConstantDeserializer getConstantDeserializer() {
- return constantDescriptorDeserializer;
- }
-}
diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DescriptorDeserializersStorage.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DescriptorDeserializersStorage.java
index a0e7c12688a..866c8899d95 100644
--- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DescriptorDeserializersStorage.java
+++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DescriptorDeserializersStorage.java
@@ -108,7 +108,7 @@ public class DescriptorDeserializersStorage {
result = new ArrayList();
memberAnnotations.put(paramSignature, result);
}
- return AnnotationDescriptorDeserializer.resolveAnnotation(className, result, classResolver);
+ return AnnotationDescriptorLoader.resolveAnnotation(className, result, classResolver);
}
}
@@ -123,7 +123,7 @@ public class DescriptorDeserializersStorage {
@Nullable
@Override
public KotlinJvmBinaryClass.AnnotationArgumentVisitor visitAnnotation(@NotNull JvmClassName className) {
- return AnnotationDescriptorDeserializer.resolveAnnotation(className, result, classResolver);
+ return AnnotationDescriptorLoader.resolveAnnotation(className, result, classResolver);
}
@Override
diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializationGlobalContextForJava.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializationGlobalContextForJava.kt
new file mode 100644
index 00000000000..5e74f50087b
--- /dev/null
+++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializationGlobalContextForJava.kt
@@ -0,0 +1,29 @@
+/*
+ * 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.lang.resolve.kotlin
+
+import org.jetbrains.jet.descriptors.serialization.context.DeserializationGlobalContext
+import org.jetbrains.jet.storage.StorageManager
+import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaPackageFragmentProvider
+
+public class DeserializationGlobalContextForJava(
+ storageManager: StorageManager,
+ descriptorFinder: JavaDescriptorFinder,
+ annotationLoader: AnnotationDescriptorLoader,
+ constantLoader: ConstantDescriptorLoader,
+ packageFragmentProvider: LazyJavaPackageFragmentProvider
+) : DeserializationGlobalContext(storageManager, descriptorFinder, annotationLoader, constantLoader, packageFragmentProvider)
diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java
index 97ff219b3ec..f35d0f30dcc 100644
--- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java
+++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/DeserializedDescriptorResolver.java
@@ -19,68 +19,28 @@ package org.jetbrains.jet.lang.resolve.kotlin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.descriptors.serialization.ClassData;
-import org.jetbrains.jet.descriptors.serialization.ClassId;
-import org.jetbrains.jet.descriptors.serialization.DescriptorFinder;
import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
-import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
import org.jetbrains.jet.lang.resolve.java.resolver.ErrorReporter;
-import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProvider;
import org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassHeader;
-import org.jetbrains.jet.lang.resolve.name.FqName;
-import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
-import org.jetbrains.jet.storage.StorageManager;
import javax.inject.Inject;
-import java.util.Collection;
-import static org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.kotlinFqNameToJavaFqName;
import static org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassHeader.Kind.CLASS;
import static org.jetbrains.jet.lang.resolve.kotlin.header.KotlinClassHeader.Kind.PACKAGE_FACADE;
public final class DeserializedDescriptorResolver {
- private DescriptorDeserializers deserializers;
-
- private StorageManager storageManager;
-
- private JavaPackageFragmentProvider javaPackageFragmentProvider;
-
- private JavaDescriptorResolver javaDescriptorResolver;
+ private DeserializationGlobalContextForJava context;
private ErrorReporter errorReporter;
- @NotNull
- private final DescriptorFinder javaDescriptorFinder = new DescriptorFinder() {
- @Nullable
- @Override
- public ClassDescriptor findClass(@NotNull ClassId classId) {
- return javaDescriptorResolver.resolveClass(kotlinFqNameToJavaFqName(classId.asSingleFqName()));
- }
-
- @NotNull
- @Override
- public Collection getClassNames(@NotNull FqName packageName) {
- return javaPackageFragmentProvider.getClassNamesInPackage(packageName);
- }
- };
-
@Inject
- public void setDeserializers(DescriptorDeserializers deserializers) {
- this.deserializers = deserializers;
- }
-
- @Inject
- public void setJavaPackageFragmentProvider(JavaPackageFragmentProvider javaPackageFragmentProvider) {
- this.javaPackageFragmentProvider = javaPackageFragmentProvider;
- }
-
- @Inject
- public void setJavaDescriptorResolver(JavaDescriptorResolver javaDescriptorResolver) {
- this.javaDescriptorResolver = javaDescriptorResolver;
+ public void setContext(DeserializationGlobalContextForJava context) {
+ this.context = context;
}
@Inject
@@ -88,18 +48,12 @@ public final class DeserializedDescriptorResolver {
this.errorReporter = errorReporter;
}
- @Inject
- public void setStorageManager(StorageManager storageManager) {
- this.storageManager = storageManager;
- }
-
@Nullable
public ClassDescriptor resolveClass(@NotNull KotlinJvmBinaryClass kotlinClass) {
String[] data = readData(kotlinClass, CLASS);
if (data != null) {
ClassData classData = JavaProtoBufUtil.readClassDataFrom(data);
- return new DeserializedClassDescriptor(storageManager, deserializers, javaDescriptorFinder,
- javaPackageFragmentProvider, classData.getNameResolver(), classData.getClassProto());
+ return new DeserializedClassDescriptor(context, classData);
}
return null;
}
@@ -108,8 +62,7 @@ public final class DeserializedDescriptorResolver {
public JetScope createKotlinPackageScope(@NotNull PackageFragmentDescriptor descriptor, @NotNull KotlinJvmBinaryClass kotlinClass) {
String[] data = readData(kotlinClass, PACKAGE_FACADE);
if (data != null) {
- return new DeserializedPackageMemberScope(storageManager, descriptor, deserializers,
- javaDescriptorFinder, JavaProtoBufUtil.readPackageDataFrom(data));
+ return new DeserializedPackageMemberScope(descriptor, JavaProtoBufUtil.readPackageDataFrom(data), context);
}
return null;
}
diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/JavaDescriptorFinder.kt b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/JavaDescriptorFinder.kt
new file mode 100644
index 00000000000..43b79efcd45
--- /dev/null
+++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/kotlin/JavaDescriptorFinder.kt
@@ -0,0 +1,41 @@
+/*
+ * 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.lang.resolve.kotlin
+
+import org.jetbrains.annotations.Nullable
+import org.jetbrains.jet.descriptors.serialization.ClassId
+import org.jetbrains.jet.descriptors.serialization.DescriptorFinder
+import org.jetbrains.jet.lang.descriptors.ClassDescriptor
+import org.jetbrains.jet.lang.resolve.java.resolver.JavaPackageFragmentProvider
+import org.jetbrains.jet.lang.resolve.name.FqName
+import org.jetbrains.jet.lang.resolve.name.Name
+import org.jetbrains.jet.lang.types.DependencyClassByQualifiedNameResolver
+import org.jetbrains.jet.lang.resolve.kotlin.DeserializedResolverUtils.kotlinFqNameToJavaFqName
+
+public class JavaDescriptorFinder(
+ private val javaDescriptorResolver: DependencyClassByQualifiedNameResolver,
+ private val javaPackageFragmentProvider: JavaPackageFragmentProvider
+) : DescriptorFinder {
+
+ override fun findClass(classId: ClassId): ClassDescriptor? {
+ return javaDescriptorResolver.resolveClass(kotlinFqNameToJavaFqName(classId.asSingleFqName()))
+ }
+
+ override fun getClassNames(packageName: FqName): Collection {
+ return javaPackageFragmentProvider.getClassNamesInPackage(packageName)
+ }
+}
diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java
index 455c7ff4afc..7c29790768c 100644
--- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java
+++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java
@@ -346,9 +346,10 @@ public class OverridingUtil {
@NotNull DescriptorSink sink
) {
Collection visibleOverridables = filterVisibleFakeOverrides(current, overridables);
- Modality modality = getMinimalModality(visibleOverridables);
boolean allInvisible = visibleOverridables.isEmpty();
Collection effectiveOverridden = allInvisible ? overridables : visibleOverridables;
+
+ Modality modality = getMinimalModality(effectiveOverridden);
Visibility visibility = allInvisible ? Visibilities.INVISIBLE_FAKE : Visibilities.INHERITED;
CallableMemberDescriptor mostSpecific = selectMostSpecificMemberFromSuper(effectiveOverridden);
CallableMemberDescriptor fakeOverride =
diff --git a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.java b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.java
index e6a3e2b329e..68800b876ad 100644
--- a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.java
+++ b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/BuiltinsPackageFragment.java
@@ -20,8 +20,8 @@ import kotlin.Function0;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.descriptors.serialization.*;
-import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope;
-import org.jetbrains.jet.descriptors.serialization.descriptors.Deserializers;
+import org.jetbrains.jet.descriptors.serialization.context.DeserializationContext;
+import org.jetbrains.jet.descriptors.serialization.descriptors.*;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptorImpl;
@@ -51,9 +51,13 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl {
packageFragmentProvider = new BuiltinsPackageFragmentProvider();
- // TODO: support annotations
- members = new DeserializedPackageMemberScope(storageManager, this, Deserializers.UNSUPPORTED,
- new BuiltInsDescriptorFinder(storageManager), new PackageData(nameResolver, loadPackage()));
+ DeserializationContext context = new DeserializationContext(
+ storageManager, new BuiltInsDescriptorFinder(storageManager),
+ // TODO: support annotations
+ AnnotationLoader.UNSUPPORTED, ConstantLoader.UNSUPPORTED, packageFragmentProvider,
+ nameResolver
+ );
+ members = new DeserializedPackageMemberScope(this, loadPackage(), context);
}
@NotNull
@@ -118,7 +122,7 @@ class BuiltinsPackageFragment extends PackageFragmentDescriptorImpl {
public BuiltInsDescriptorFinder(@NotNull StorageManager storageManager) {
// TODO: support annotations
- super(storageManager, Deserializers.UNSUPPORTED, packageFragmentProvider);
+ super(storageManager, AnnotationLoader.UNSUPPORTED, ConstantLoader.UNSUPPORTED, packageFragmentProvider);
classNames = storageManager.createLazyValue(new Function0>() {
@Override
diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/AbstractDescriptorFinder.java b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/AbstractDescriptorFinder.java
index 27a2eeb9123..1921bed08c4 100644
--- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/AbstractDescriptorFinder.java
+++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/AbstractDescriptorFinder.java
@@ -19,8 +19,8 @@ package org.jetbrains.jet.descriptors.serialization;
import kotlin.Function1;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import org.jetbrains.jet.descriptors.serialization.descriptors.Deserializers;
-import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedClassDescriptor;
+import org.jetbrains.jet.descriptors.serialization.context.DeserializationGlobalContext;
+import org.jetbrains.jet.descriptors.serialization.descriptors.*;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.PackageFragmentProvider;
import org.jetbrains.jet.storage.MemoizedFunctionToNullable;
@@ -28,26 +28,21 @@ import org.jetbrains.jet.storage.StorageManager;
public abstract class AbstractDescriptorFinder implements DescriptorFinder {
private final MemoizedFunctionToNullable findClass;
- private final Deserializers deserializers;
public AbstractDescriptorFinder(
- @NotNull final StorageManager storageManager,
- @NotNull Deserializers deserializers,
- @NotNull final PackageFragmentProvider packageFragmentProvider
+ @NotNull StorageManager storageManager,
+ @NotNull AnnotationLoader annotationLoader,
+ @NotNull ConstantLoader constantLoader,
+ @NotNull PackageFragmentProvider packageFragmentProvider
) {
- this.deserializers = deserializers;
-
+ final DeserializationGlobalContext deserializationGlobalContext =
+ new DeserializationGlobalContext(storageManager, this, annotationLoader, constantLoader,
+ packageFragmentProvider);
this.findClass = storageManager.createMemoizedFunctionWithNullableValues(new Function1() {
@Override
public ClassDescriptor invoke(ClassId classId) {
ClassData classData = getClassData(classId);
- if (classData == null) {
- return null;
- }
-
- AbstractDescriptorFinder _this = AbstractDescriptorFinder.this;
- return new DeserializedClassDescriptor(storageManager, _this.deserializers, _this, packageFragmentProvider,
- classData.getNameResolver(), classData.getClassProto());
+ return classData == null ? null : new DeserializedClassDescriptor(deserializationGlobalContext, classData);
}
});
}
diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/MemberDeserializer.java
similarity index 50%
rename from core/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java
rename to core/serialization/src/org/jetbrains/jet/descriptors/serialization/MemberDeserializer.java
index c31892c63c9..e0a4c879f93 100644
--- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/DescriptorDeserializer.java
+++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/MemberDeserializer.java
@@ -19,15 +19,17 @@ package org.jetbrains.jet.descriptors.serialization;
import kotlin.Function0;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jet.descriptors.serialization.context.DeserializationContextWithTypes;
import org.jetbrains.jet.descriptors.serialization.descriptors.*;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.Annotations;
-import org.jetbrains.jet.lang.descriptors.impl.*;
+import org.jetbrains.jet.lang.descriptors.impl.ConstructorDescriptorImpl;
+import org.jetbrains.jet.lang.descriptors.impl.PropertyGetterDescriptorImpl;
+import org.jetbrains.jet.lang.descriptors.impl.PropertySetterDescriptorImpl;
+import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl;
import org.jetbrains.jet.lang.resolve.DescriptorFactory;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
-import org.jetbrains.jet.lang.types.Variance;
-import org.jetbrains.jet.storage.StorageManager;
import java.util.ArrayList;
import java.util.Collections;
@@ -35,86 +37,14 @@ import java.util.List;
import static org.jetbrains.jet.descriptors.serialization.ProtoBuf.Callable;
import static org.jetbrains.jet.descriptors.serialization.ProtoBuf.TypeParameter;
-import static org.jetbrains.jet.descriptors.serialization.TypeDeserializer.TypeParameterResolver.NONE;
-import static org.jetbrains.jet.descriptors.serialization.descriptors.Deserializers.AnnotatedCallableKind;
+import static org.jetbrains.jet.descriptors.serialization.SerializationPackage.*;
-public class DescriptorDeserializer {
+public class MemberDeserializer {
- @NotNull
- public static DescriptorDeserializer create(
- @NotNull StorageManager storageManager,
- @NotNull DeclarationDescriptor containingDeclaration,
- @NotNull NameResolver nameResolver,
- @NotNull DescriptorFinder descriptorFinder,
- @NotNull Deserializers deserializers
- ) {
- return new DescriptorDeserializer(storageManager,
- new TypeDeserializer(storageManager, null, nameResolver, descriptorFinder,
- "Deserializer for " + containingDeclaration.getName(), NONE),
- containingDeclaration, nameResolver, deserializers);
- }
+ private final DeserializationContextWithTypes context;
- @NotNull
- public static DescriptorDeserializer create(
- @NotNull StorageManager storageManager,
- @NotNull TypeDeserializer typeDeserializer,
- @NotNull DeclarationDescriptor containingDeclaration,
- @NotNull NameResolver nameResolver,
- @NotNull Deserializers deserializers
- ) {
- return new DescriptorDeserializer(storageManager, typeDeserializer, containingDeclaration, nameResolver, deserializers);
- }
-
- private final DeclarationDescriptor containingDeclaration;
- private final NameResolver nameResolver;
- private final TypeDeserializer typeDeserializer;
- private final Deserializers deserializers;
-
- private final StorageManager storageManager;
-
- private DescriptorDeserializer(
- @NotNull StorageManager storageManager,
- @NotNull TypeDeserializer typeDeserializer,
- @NotNull DeclarationDescriptor containingDeclaration,
- @NotNull NameResolver nameResolver,
- @NotNull Deserializers deserializers
- ) {
- this.storageManager = storageManager;
- this.typeDeserializer = typeDeserializer;
- this.containingDeclaration = containingDeclaration;
- this.nameResolver = nameResolver;
- this.deserializers = deserializers;
- }
-
- @NotNull
- public TypeDeserializer getTypeDeserializer() {
- return typeDeserializer;
- }
-
- @NotNull
- public NameResolver getNameResolver() {
- return nameResolver;
- }
-
- @NotNull
- public DescriptorDeserializer createChildDeserializer(
- @NotNull DeclarationDescriptor descriptor,
- @NotNull final List typeParameterProtos,
- @NotNull final List typeParameters
- ) {
- TypeDeserializer childTypeDeserializer = new TypeDeserializer(
- storageManager,
- typeDeserializer, "Child deserializer for " + descriptor.getName(),
- new TypeDeserializer.TypeParameterResolver() {
- @NotNull
- @Override
- public List getTypeParameters(@NotNull TypeDeserializer typeDeserializer) {
- List descriptors = typeParameters(typeParameterProtos, typeDeserializer);
- typeParameters.addAll(descriptors);
- return descriptors;
- }
- });
- return create(storageManager, childTypeDeserializer, descriptor, nameResolver, deserializers);
+ public MemberDeserializer(@NotNull DeserializationContextWithTypes context) {
+ this.context = context;
}
@NotNull
@@ -137,25 +67,25 @@ public class DescriptorDeserializer {
final int flags = proto.getFlags();
DeserializedPropertyDescriptor property = new DeserializedPropertyDescriptor(
- containingDeclaration,
+ context.getContainingDeclaration(),
null,
getAnnotations(proto, flags, AnnotatedCallableKind.PROPERTY),
modality(Flags.MODALITY.get(flags)),
visibility(Flags.VISIBILITY.get(flags)),
Flags.CALLABLE_KIND.get(flags) == Callable.CallableKind.VAR,
- nameResolver.getName(proto.getName()),
- memberKind(Flags.MEMBER_KIND.get(flags)),
+ context.getNameResolver().getName(proto.getName()),
+ SerializationPackage.memberKind(Flags.MEMBER_KIND.get(flags)),
proto,
- nameResolver
+ context.getNameResolver()
);
List typeParameters = new ArrayList(proto.getTypeParameterCount());
- DescriptorDeserializer local = createChildDeserializer(property, proto.getTypeParameterList(), typeParameters);
+ DeserializationContextWithTypes local = context.childContext(property, proto.getTypeParameterList(), typeParameters);
property.setType(
- local.typeDeserializer.type(proto.getReturnType()),
+ local.getTypeDeserializer().type(proto.getReturnType()),
typeParameters,
getExpectedThisObject(),
- local.typeDeserializer.typeOrNull(proto.hasReceiverType() ? proto.getReceiverType() : null)
+ local.getTypeDeserializer().typeOrNull(proto.hasReceiverType() ? proto.getReceiverType() : null)
);
PropertyGetterDescriptorImpl getter = null;
@@ -168,7 +98,8 @@ public class DescriptorDeserializer {
getter = new PropertyGetterDescriptorImpl(property,
getAnnotations(proto, getterFlags, AnnotatedCallableKind.PROPERTY_GETTER),
modality(Flags.MODALITY.get(getterFlags)),
- visibility(Flags.VISIBILITY.get(getterFlags)), isNotDefault, !isNotDefault,
+ visibility(Flags.VISIBILITY.get(getterFlags)),
+ isNotDefault, !isNotDefault,
property.getKind(), null);
}
else {
@@ -184,11 +115,13 @@ public class DescriptorDeserializer {
setter = new PropertySetterDescriptorImpl(property,
getAnnotations(proto, setterFlags, AnnotatedCallableKind.PROPERTY_SETTER),
modality(Flags.MODALITY.get(setterFlags)),
- visibility(Flags.VISIBILITY.get(setterFlags)), isNotDefault, !isNotDefault,
+ visibility(Flags.VISIBILITY.get(setterFlags)), isNotDefault,
+ !isNotDefault,
property.getKind(), null);
- DescriptorDeserializer setterLocal = local.createChildDeserializer(setter, Collections.emptyList(),
- Collections.emptyList());
- List valueParameters = setterLocal.valueParameters(proto, AnnotatedCallableKind.PROPERTY_SETTER);
+ DeserializationContextWithTypes setterLocal = local.childContext(setter, Collections.emptyList(),
+ Collections.emptyList());
+ List valueParameters
+ = setterLocal.getDeserializer().valueParameters(proto, AnnotatedCallableKind.PROPERTY_SETTER);
assert valueParameters.size() == 1 : "Property setter should have a single value parameter: " + setter;
setter.initialize(valueParameters.get(0));
}
@@ -199,16 +132,16 @@ public class DescriptorDeserializer {
if (Flags.HAS_CONSTANT.get(flags)) {
property.setCompileTimeInitializer(
- storageManager.createNullableLazyValue(new Function0>() {
+ context.getStorageManager().createNullableLazyValue(new Function0>() {
@Nullable
@Override
public CompileTimeConstant> invoke() {
+ DeclarationDescriptor containingDeclaration = context.getContainingDeclaration();
assert containingDeclaration instanceof ClassOrPackageFragmentDescriptor
: "Only members in classes or package fragments should be serialized: " + containingDeclaration;
- return deserializers.getConstantDeserializer().loadPropertyConstant(
- (ClassOrPackageFragmentDescriptor) containingDeclaration,
- proto, nameResolver,
- AnnotatedCallableKind.PROPERTY);
+ return context.getConstantLoader().loadPropertyConstant(
+ (ClassOrPackageFragmentDescriptor) containingDeclaration, proto,
+ context.getNameResolver(), AnnotatedCallableKind.PROPERTY);
}
})
);
@@ -223,18 +156,16 @@ public class DescriptorDeserializer {
private CallableMemberDescriptor loadFunction(@NotNull Callable proto) {
int flags = proto.getFlags();
DeserializedSimpleFunctionDescriptor function = DeserializedSimpleFunctionDescriptor.create(
- containingDeclaration, proto,
- deserializers,
- nameResolver
+ context.getContainingDeclaration(), proto, context.getAnnotationLoader(), context.getNameResolver()
);
List typeParameters = new ArrayList(proto.getTypeParameterCount());
- DescriptorDeserializer local = createChildDeserializer(function, proto.getTypeParameterList(), typeParameters);
+ DeserializationContextWithTypes local = context.childContext(function, proto.getTypeParameterList(), typeParameters);
function.initialize(
- local.typeDeserializer.typeOrNull(proto.hasReceiverType() ? proto.getReceiverType() : null),
+ local.getTypeDeserializer().typeOrNull(proto.hasReceiverType() ? proto.getReceiverType() : null),
getExpectedThisObject(),
typeParameters,
- local.valueParameters(proto, AnnotatedCallableKind.FUNCTION),
- local.typeDeserializer.type(proto.getReturnType()),
+ local.getDeserializer().valueParameters(proto, AnnotatedCallableKind.FUNCTION),
+ local.getTypeDeserializer().type(proto.getReturnType()),
modality(Flags.MODALITY.get(flags)),
visibility(Flags.VISIBILITY.get(flags))
);
@@ -243,33 +174,34 @@ public class DescriptorDeserializer {
@Nullable
private ReceiverParameterDescriptor getExpectedThisObject() {
+ DeclarationDescriptor containingDeclaration = context.getContainingDeclaration();
return containingDeclaration instanceof ClassDescriptor
? ((ClassDescriptor) containingDeclaration).getThisAsReceiverParameter() : null;
}
@NotNull
private CallableMemberDescriptor loadConstructor(@NotNull Callable proto) {
- ClassDescriptor classDescriptor = (ClassDescriptor) containingDeclaration;
+ ClassDescriptor classDescriptor = (ClassDescriptor) context.getContainingDeclaration();
ConstructorDescriptorImpl descriptor = ConstructorDescriptorImpl.create(
classDescriptor,
getAnnotations(proto, proto.getFlags(), AnnotatedCallableKind.FUNCTION),
// TODO: primary
true);
List typeParameters = new ArrayList(proto.getTypeParameterCount());
- DescriptorDeserializer local = createChildDeserializer(descriptor, Collections.emptyList(), typeParameters);
+ DeserializationContextWithTypes local = context.childContext(descriptor, Collections.emptyList(), typeParameters);
descriptor.initialize(
classDescriptor.getTypeConstructor().getParameters(),
- local.valueParameters(proto, AnnotatedCallableKind.FUNCTION),
+ local.getDeserializer().valueParameters(proto, AnnotatedCallableKind.FUNCTION),
visibility(Flags.VISIBILITY.get(proto.getFlags())),
DescriptorUtils.isConstructorOfStaticNestedClass(descriptor)
);
- descriptor.setReturnType(local.typeDeserializer.type(proto.getReturnType()));
+ descriptor.setReturnType(local.getTypeDeserializer().type(proto.getReturnType()));
return descriptor;
}
@NotNull
private Annotations getAnnotations(@NotNull Callable proto, int flags, @NotNull AnnotatedCallableKind kind) {
- return getAnnotations(containingDeclaration, proto, flags, kind, deserializers.getAnnotationDeserializer(), nameResolver);
+ return getAnnotations(context.getContainingDeclaration(), proto, flags, kind, context.getAnnotationLoader(), context.getNameResolver());
}
public static Annotations getAnnotations(
@@ -277,80 +209,13 @@ public class DescriptorDeserializer {
@NotNull Callable proto,
int flags,
@NotNull AnnotatedCallableKind kind,
- @NotNull AnnotationDeserializer annotationDeserializer,
+ @NotNull AnnotationLoader annotationLoader,
@NotNull NameResolver nameResolver
) {
assert containingDeclaration instanceof ClassOrPackageFragmentDescriptor
: "Only members in classes or package fragments should be serialized: " + containingDeclaration;
- return Flags.HAS_ANNOTATIONS.get(flags)
- ? annotationDeserializer
- .loadCallableAnnotations((ClassOrPackageFragmentDescriptor) containingDeclaration, proto, nameResolver, kind)
- : Annotations.EMPTY;
- }
-
- public static CallableMemberDescriptor.Kind memberKind(Callable.MemberKind memberKind) {
- switch (memberKind) {
- case DECLARATION:
- return CallableMemberDescriptor.Kind.DECLARATION;
- case FAKE_OVERRIDE:
- return CallableMemberDescriptor.Kind.FAKE_OVERRIDE;
- case DELEGATION:
- return CallableMemberDescriptor.Kind.DELEGATION;
- case SYNTHESIZED:
- return CallableMemberDescriptor.Kind.SYNTHESIZED;
- }
- throw new IllegalArgumentException("Unknown member kind: " + memberKind);
- }
-
- @NotNull
- public static Modality modality(@NotNull ProtoBuf.Modality modality) {
- switch (modality) {
- case FINAL:
- return Modality.FINAL;
- case OPEN:
- return Modality.OPEN;
- case ABSTRACT:
- return Modality.ABSTRACT;
- }
- throw new IllegalArgumentException("Unknown modality: " + modality);
- }
-
- @NotNull
- public static Visibility visibility(@NotNull ProtoBuf.Visibility visibility) {
- switch (visibility) {
- case INTERNAL:
- return Visibilities.INTERNAL;
- case PRIVATE:
- return Visibilities.PRIVATE;
- case PROTECTED:
- return Visibilities.PROTECTED;
- case PUBLIC:
- return Visibilities.PUBLIC;
- case EXTRA:
- throw new UnsupportedOperationException("Extra visibilities are not supported yet"); // TODO
- }
- throw new IllegalArgumentException("Unknown visibility: " + visibility);
- }
-
- @NotNull
- public static ClassKind classKind(@NotNull ProtoBuf.Class.Kind kind) {
- switch (kind) {
- case CLASS:
- return ClassKind.CLASS;
- case TRAIT:
- return ClassKind.TRAIT;
- case ENUM_CLASS:
- return ClassKind.ENUM_CLASS;
- case ENUM_ENTRY:
- return ClassKind.ENUM_ENTRY;
- case ANNOTATION_CLASS:
- return ClassKind.ANNOTATION_CLASS;
- case OBJECT:
- return ClassKind.OBJECT;
- case CLASS_OBJECT:
- return ClassKind.CLASS_OBJECT;
- }
- throw new IllegalArgumentException("Unknown class kind: " + kind);
+ return Flags.HAS_ANNOTATIONS.get(flags) ? annotationLoader.loadCallableAnnotations(
+ (ClassOrPackageFragmentDescriptor) containingDeclaration, proto, nameResolver, kind) : Annotations.EMPTY;
}
@NotNull
@@ -362,11 +227,11 @@ public class DescriptorDeserializer {
for (int i = 0; i < protos.size(); i++) {
TypeParameter proto = protos.get(i);
DeserializedTypeParameterDescriptor descriptor = new DeserializedTypeParameterDescriptor(
- storageManager,
+ context.getStorageManager(),
typeDeserializer,
proto,
- containingDeclaration,
- nameResolver.getName(proto.getName()),
+ context.getContainingDeclaration(),
+ context.getNameResolver().getName(proto.getName()),
variance(proto.getVariance()),
proto.getReified(),
i
@@ -376,21 +241,9 @@ public class DescriptorDeserializer {
return result;
}
- private static Variance variance(TypeParameter.Variance proto) {
- switch (proto) {
- case IN:
- return Variance.IN_VARIANCE;
- case OUT:
- return Variance.OUT_VARIANCE;
- case INV:
- return Variance.INVARIANT;
- }
- throw new IllegalStateException("Unknown projection: " + proto);
- }
-
@NotNull
private List valueParameters(@NotNull Callable callable, @NotNull AnnotatedCallableKind kind) {
- DeclarationDescriptor containerOfCallable = containingDeclaration.getContainingDeclaration();
+ DeclarationDescriptor containerOfCallable = context.getContainingDeclaration().getContainingDeclaration();
assert containerOfCallable instanceof ClassOrPackageFragmentDescriptor
: "Only members in classes or package fragments should be serialized: " + containerOfCallable;
ClassOrPackageFragmentDescriptor classOrPackage = (ClassOrPackageFragmentDescriptor) containerOfCallable;
@@ -400,14 +253,14 @@ public class DescriptorDeserializer {
for (int i = 0; i < protos.size(); i++) {
Callable.ValueParameter proto = protos.get(i);
result.add(new ValueParameterDescriptorImpl(
- containingDeclaration,
+ context.getContainingDeclaration(),
null,
i,
getAnnotations(classOrPackage, callable, kind, proto),
- nameResolver.getName(proto.getName()),
- typeDeserializer.type(proto.getType()),
+ context.getNameResolver().getName(proto.getName()),
+ context.getTypeDeserializer().type(proto.getType()),
Flags.DECLARES_DEFAULT_VALUE.get(proto.getFlags()),
- typeDeserializer.typeOrNull(proto.hasVarargElementType() ? proto.getVarargElementType() : null))
+ context.getTypeDeserializer().typeOrNull(proto.hasVarargElementType() ? proto.getVarargElementType() : null))
);
}
return result;
@@ -420,8 +273,8 @@ public class DescriptorDeserializer {
@NotNull AnnotatedCallableKind kind,
@NotNull Callable.ValueParameter valueParameter
) {
- return Flags.HAS_ANNOTATIONS.get(valueParameter.getFlags())
- ? deserializers.getAnnotationDeserializer().loadValueParameterAnnotations(classOrPackage, callable, nameResolver, kind, valueParameter)
+ return Flags.HAS_ANNOTATIONS.get(valueParameter.getFlags()) ? context.getAnnotationLoader()
+ .loadValueParameterAnnotations(classOrPackage, callable, context.getNameResolver(), kind, valueParameter)
: Annotations.EMPTY;
}
}
diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/TypeDeserializer.java b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/TypeDeserializer.java
index 20dc60e8bd9..7fce8635c68 100644
--- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/TypeDeserializer.java
+++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/TypeDeserializer.java
@@ -21,6 +21,8 @@ import kotlin.Function0;
import kotlin.Function1;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.annotations.ReadOnly;
+import org.jetbrains.jet.descriptors.serialization.context.DeserializationContext;
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedTypeParameterDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
@@ -30,12 +32,13 @@ import org.jetbrains.jet.lang.resolve.scopes.JetScope;
import org.jetbrains.jet.lang.types.*;
import org.jetbrains.jet.storage.MemoizedFunctionToNullable;
import org.jetbrains.jet.storage.NotNullLazyValue;
-import org.jetbrains.jet.storage.StorageManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import static org.jetbrains.jet.descriptors.serialization.SerializationPackage.variance;
+
public class TypeDeserializer {
public interface TypeParameterResolver {
@@ -48,11 +51,10 @@ public class TypeDeserializer {
};
@NotNull
+ @ReadOnly
List getTypeParameters(@NotNull TypeDeserializer typeDeserializer);
}
- private final NameResolver nameResolver;
- private final DescriptorFinder descriptorFinder;
private final TypeDeserializer parent;
// never written to after constructor returns
@@ -62,45 +64,29 @@ public class TypeDeserializer {
private final String debugName;
- private final StorageManager storageManager;
+ private final DeserializationContext context;
public TypeDeserializer(
- @NotNull StorageManager storageManager,
- @NotNull TypeDeserializer parent,
- @NotNull String debugName,
- @NotNull TypeParameterResolver typeParameterResolver
- ) {
- this(storageManager, parent, parent.nameResolver, parent.descriptorFinder, debugName, typeParameterResolver);
- }
-
- public TypeDeserializer(
- @NotNull StorageManager storageManager,
+ @NotNull DeserializationContext context,
@Nullable TypeDeserializer parent,
- @NotNull NameResolver nameResolver,
- @NotNull DescriptorFinder descriptorFinder,
@NotNull String debugName,
@NotNull TypeParameterResolver typeParameterResolver
) {
- this.storageManager = storageManager;
this.parent = parent;
- this.nameResolver = nameResolver;
- this.descriptorFinder = descriptorFinder;
this.debugName = debugName + (parent == null ? "" : ". Child of " + parent.debugName);
+ this.context = context;
for (DeserializedTypeParameterDescriptor typeParameterDescriptor : typeParameterResolver.getTypeParameters(this)) {
typeParameterDescriptors.put(typeParameterDescriptor.getProtoId(), typeParameterDescriptor);
}
- this.classDescriptors = storageManager.createMemoizedFunctionWithNullableValues(new Function1() {
- @Override
- public ClassDescriptor invoke(Integer fqNameIndex) {
- return computeClassDescriptor(fqNameIndex);
- }
- });
- }
-
- /* package */ DescriptorFinder getDescriptorFinder() {
- return descriptorFinder;
+ this.classDescriptors = context.getStorageManager().createMemoizedFunctionWithNullableValues(
+ new Function1() {
+ @Override
+ public ClassDescriptor invoke(Integer fqNameIndex) {
+ return computeClassDescriptor(fqNameIndex);
+ }
+ });
}
@Nullable
@@ -122,7 +108,7 @@ public class TypeDeserializer {
TypeConstructor typeConstructor = typeConstructor(constructorProto);
if (typeConstructor == null) {
String message = constructorProto.getKind() == ProtoBuf.Type.Constructor.Kind.CLASS
- ? nameResolver.getClassId(id).asSingleFqName().asString()
+ ? context.getNameResolver().getClassId(id).asSingleFqName().asString()
: "Unknown type parameter " + id;
typeConstructor = ErrorUtils.createErrorType(message).getConstructor();
}
@@ -159,8 +145,8 @@ public class TypeDeserializer {
@Nullable
private ClassDescriptor computeClassDescriptor(int fqNameIndex) {
- ClassId classId = nameResolver.getClassId(fqNameIndex);
- return descriptorFinder.findClass(classId);
+ ClassId classId = context.getNameResolver().getClassId(fqNameIndex);
+ return context.getDescriptorFinder().findClass(classId);
}
private List typeArguments(List protos) {
@@ -172,22 +158,7 @@ public class TypeDeserializer {
}
private TypeProjection typeProjection(ProtoBuf.Type.Argument proto) {
- return new TypeProjectionImpl(
- variance(proto.getProjection()),
- type(proto.getType())
- );
- }
-
- private static Variance variance(ProtoBuf.Type.Argument.Projection proto) {
- switch (proto) {
- case IN:
- return Variance.IN_VARIANCE;
- case OUT:
- return Variance.OUT_VARIANCE;
- case INV:
- return Variance.INVARIANT;
- }
- throw new IllegalStateException("Unknown projection: " + proto);
+ return new TypeProjectionImpl(variance(proto.getProjection()), type(proto.getType()));
}
@NotNull
@@ -215,13 +186,13 @@ public class TypeDeserializer {
this.typeProto = proto;
this.arguments = typeArguments(proto.getArgumentList());
- this.constructor = storageManager.createLazyValue(new Function0() {
+ this.constructor = context.getStorageManager().createLazyValue(new Function0() {
@Override
public TypeConstructor invoke() {
return typeConstructor(typeProto);
}
});
- this.memberScope = storageManager.createLazyValue(new Function0() {
+ this.memberScope = context.getStorageManager().createLazyValue(new Function0() {
@Override
public JetScope invoke() {
return computeMemberScope();
diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/context/context.kt b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/context/context.kt
new file mode 100644
index 00000000000..5ad04c4f5cf
--- /dev/null
+++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/context/context.kt
@@ -0,0 +1,101 @@
+/*
+ * 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.context
+
+import org.jetbrains.jet.storage.StorageManager
+import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationLoader
+import org.jetbrains.jet.lang.descriptors.PackageFragmentProvider
+import org.jetbrains.jet.descriptors.serialization.DescriptorFinder
+import org.jetbrains.jet.descriptors.serialization.NameResolver
+import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
+import org.jetbrains.jet.descriptors.serialization.TypeDeserializer
+import org.jetbrains.jet.descriptors.serialization.MemberDeserializer
+import org.jetbrains.jet.descriptors.serialization.ProtoBuf.TypeParameter
+import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor
+import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedTypeParameterDescriptor
+import org.jetbrains.jet.descriptors.serialization.descriptors.ConstantLoader
+
+public open class DeserializationGlobalContext(
+ public val storageManager: StorageManager,
+ public val descriptorFinder: DescriptorFinder,
+ public val annotationLoader: AnnotationLoader,
+ public val constantLoader: ConstantLoader,
+ public val packageFragmentProvider: PackageFragmentProvider
+) {
+ public fun withNameResolver(nameResolver: NameResolver): DeserializationContext {
+ return DeserializationContext(storageManager, descriptorFinder, annotationLoader,
+ constantLoader, packageFragmentProvider, nameResolver)
+ }
+}
+
+
+public open class DeserializationContext(
+ storageManager: StorageManager,
+ descriptorFinder: DescriptorFinder,
+ annotationLoader: AnnotationLoader,
+ constantLoader: ConstantLoader,
+ packageFragmentProvider: PackageFragmentProvider,
+ public val nameResolver: NameResolver
+) : DeserializationGlobalContext(storageManager, descriptorFinder, annotationLoader,
+ constantLoader, packageFragmentProvider) {
+ fun withTypes(containingDeclaration: DeclarationDescriptor): DeserializationContextWithTypes {
+ val typeDeserializer = TypeDeserializer(this, null, "Deserializer for ${containingDeclaration.getName()}",
+ TypeDeserializer.TypeParameterResolver.NONE)
+ return withTypes(containingDeclaration, typeDeserializer)
+ }
+
+ fun withTypes(containingDeclaration: DeclarationDescriptor, typeDeserializer: TypeDeserializer): DeserializationContextWithTypes {
+ return DeserializationContextWithTypes(storageManager, descriptorFinder, annotationLoader,
+ constantLoader, packageFragmentProvider,
+ nameResolver, containingDeclaration,
+ typeDeserializer)
+ }
+
+}
+
+
+class DeserializationContextWithTypes(
+ storageManager: StorageManager,
+ descriptorFinder: DescriptorFinder,
+ annotationLoader: AnnotationLoader,
+ constantLoader: ConstantLoader,
+ packageFragmentProvider: PackageFragmentProvider,
+ nameResolver: NameResolver,
+ val containingDeclaration: DeclarationDescriptor,
+ val typeDeserializer: TypeDeserializer
+) : DeserializationContext(storageManager, descriptorFinder, annotationLoader,
+ constantLoader, packageFragmentProvider, nameResolver) {
+ val deserializer: MemberDeserializer = MemberDeserializer(this)
+
+ public fun childContext(
+ descriptor: DeclarationDescriptor,
+ typeParameterProtos: List,
+ typeParameters: MutableList
+ ): DeserializationContextWithTypes {
+ val childTypeParameterResolver = object : TypeDeserializer.TypeParameterResolver {
+ override fun getTypeParameters(typeDeserializer: TypeDeserializer): List {
+ val descriptors = deserializer.typeParameters(typeParameterProtos, typeDeserializer)
+ typeParameters.addAll(descriptors)
+ return descriptors
+ }
+ }
+ val childTypeDeserializer = TypeDeserializer(this, typeDeserializer, "Child deserializer for " + descriptor.getName(),
+ childTypeParameterResolver)
+ return withTypes(descriptor, childTypeDeserializer)
+ }
+
+}
diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/AnnotatedCallableKind.java b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/AnnotatedCallableKind.java
new file mode 100644
index 00000000000..87858ff474a
--- /dev/null
+++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/AnnotatedCallableKind.java
@@ -0,0 +1,24 @@
+/*
+ * 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;
+
+public enum AnnotatedCallableKind {
+ FUNCTION,
+ PROPERTY,
+ PROPERTY_GETTER,
+ PROPERTY_SETTER
+}
diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/AnnotationDeserializer.java b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/AnnotationLoader.java
similarity index 93%
rename from core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/AnnotationDeserializer.java
rename to core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/AnnotationLoader.java
index 0186a81646e..6ca965b151f 100644
--- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/AnnotationDeserializer.java
+++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/AnnotationLoader.java
@@ -23,10 +23,8 @@ import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassOrPackageFragmentDescriptor;
import org.jetbrains.jet.lang.descriptors.annotations.Annotations;
-import static org.jetbrains.jet.descriptors.serialization.descriptors.Deserializers.AnnotatedCallableKind;
-
-public interface AnnotationDeserializer {
- AnnotationDeserializer UNSUPPORTED = new AnnotationDeserializer() {
+public interface AnnotationLoader {
+ AnnotationLoader UNSUPPORTED = new AnnotationLoader() {
@NotNull
@Override
public Annotations loadClassAnnotations(@NotNull ClassDescriptor descriptor, @NotNull ProtoBuf.Class classProto) {
diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/ConstantDeserializer.java b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/ConstantLoader.java
similarity index 88%
rename from core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/ConstantDeserializer.java
rename to core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/ConstantLoader.java
index 96b3c8b668c..02d8f84baec 100644
--- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/ConstantDeserializer.java
+++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/ConstantLoader.java
@@ -23,10 +23,8 @@ import org.jetbrains.jet.descriptors.serialization.ProtoBuf;
import org.jetbrains.jet.lang.descriptors.ClassOrPackageFragmentDescriptor;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
-import static org.jetbrains.jet.descriptors.serialization.descriptors.Deserializers.AnnotatedCallableKind;
-
-public interface ConstantDeserializer {
- ConstantDeserializer UNSUPPORTED = new ConstantDeserializer() {
+public interface ConstantLoader {
+ ConstantLoader UNSUPPORTED = new ConstantLoader() {
@Nullable
@Override
public CompileTimeConstant> loadPropertyConstant(
diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java
index cf3eeb56ccb..a8542e1e41a 100644
--- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java
+++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedClassDescriptor.java
@@ -22,6 +22,9 @@ import kotlin.KotlinPackage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.descriptors.serialization.*;
+import org.jetbrains.jet.descriptors.serialization.context.DeserializationContext;
+import org.jetbrains.jet.descriptors.serialization.context.DeserializationContextWithTypes;
+import org.jetbrains.jet.descriptors.serialization.context.DeserializationGlobalContext;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.Annotations;
import org.jetbrains.jet.lang.descriptors.impl.AbstractClassDescriptor;
@@ -45,21 +48,17 @@ import org.jetbrains.jet.storage.StorageManager;
import java.util.*;
-import static org.jetbrains.jet.descriptors.serialization.TypeDeserializer.TypeParameterResolver.NONE;
+import static org.jetbrains.jet.descriptors.serialization.SerializationPackage.*;
import static org.jetbrains.jet.lang.resolve.name.SpecialNames.getClassObjectName;
public class DeserializedClassDescriptor extends AbstractClassDescriptor implements ClassDescriptor {
private final ClassId classId;
private final ProtoBuf.Class classProto;
- private final StorageManager storageManager;
- private final TypeDeserializer typeDeserializer;
- private final DescriptorDeserializer deserializer;
private final DeserializedMemberScope memberScope;
private final NullableLazyValue primaryConstructor;
- private final Deserializers deserializers;
private final NotNullLazyValue annotations;
private final NullableLazyValue classObjectDescriptor;
@@ -72,33 +71,22 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
private final Visibility visibility;
private final ClassKind kind;
private final boolean isInner;
- private final DescriptorFinder descriptorFinder;
- private final PackageFragmentProvider packageFragmentProvider;
+ private final DeserializationContextWithTypes context;
- public DeserializedClassDescriptor(
- @NotNull StorageManager storageManager,
- @NotNull Deserializers deserializers,
- @NotNull DescriptorFinder descriptorFinder,
- @NotNull PackageFragmentProvider packageFragmentProvider,
- @NotNull NameResolver nameResolver,
- @NotNull ProtoBuf.Class classProto
- ) {
- super(storageManager, nameResolver.getClassId(classProto.getFqName()).getRelativeClassName().shortName());
+ public DeserializedClassDescriptor(@NotNull DeserializationGlobalContext globalContext, @NotNull ClassData classData) {
+ this(globalContext.withNameResolver(classData.getNameResolver()), classData.getClassProto());
+ }
+
+ public DeserializedClassDescriptor(@NotNull DeserializationContext outerContext, @NotNull ProtoBuf.Class classProto) {
+ super(outerContext.getStorageManager(),
+ outerContext.getNameResolver().getClassId(classProto.getFqName()).getRelativeClassName().shortName());
this.classProto = classProto;
- this.classId = nameResolver.getClassId(classProto.getFqName());
- this.storageManager = storageManager;
- this.packageFragmentProvider = packageFragmentProvider;
- this.descriptorFinder = descriptorFinder;
+ this.classId = outerContext.getNameResolver().getClassId(classProto.getFqName());
- TypeDeserializer notNullTypeDeserializer = new TypeDeserializer(storageManager, null, nameResolver,
- descriptorFinder, "Deserializer for class " + getName(), NONE);
- DescriptorDeserializer outerDeserializer = DescriptorDeserializer.create(storageManager, notNullTypeDeserializer,
- this, nameResolver, deserializers);
List typeParameters = new ArrayList(classProto.getTypeParameterCount());
- this.deserializer = outerDeserializer.createChildDeserializer(this, classProto.getTypeParameterList(), typeParameters);
- this.typeDeserializer = deserializer.getTypeDeserializer();
+ this.context = outerContext.withTypes(this).childContext(this, classProto.getTypeParameterList(), typeParameters);
- this.containingDeclaration = storageManager.createLazyValue(new Function0() {
+ this.containingDeclaration = outerContext.getStorageManager().createLazyValue(new Function0() {
@Override
public DeclarationDescriptor invoke() {
return computeContainingDeclaration();
@@ -106,30 +94,29 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
});
this.typeConstructor = new DeserializedClassTypeConstructor(typeParameters);
- this.memberScope = new DeserializedClassMemberScope(storageManager, this);
+ this.memberScope = new DeserializedClassMemberScope();
int flags = classProto.getFlags();
- this.modality = DescriptorDeserializer.modality(Flags.MODALITY.get(flags));
- this.visibility = DescriptorDeserializer.visibility(Flags.VISIBILITY.get(flags));
- this.kind = DescriptorDeserializer.classKind(Flags.CLASS_KIND.get(flags));
+ this.modality = modality(Flags.MODALITY.get(flags));
+ this.visibility = visibility(Flags.VISIBILITY.get(flags));
+ this.kind = classKind(Flags.CLASS_KIND.get(flags));
this.isInner = Flags.INNER.get(flags);
- this.deserializers = deserializers;
- this.annotations = storageManager.createLazyValue(new Function0() {
+ this.annotations = context.getStorageManager().createLazyValue(new Function0() {
@Override
public Annotations invoke() {
return computeAnnotations();
}
});
- this.primaryConstructor = storageManager.createNullableLazyValue(new Function0() {
+ this.primaryConstructor = context.getStorageManager().createNullableLazyValue(new Function0() {
@Override
public ConstructorDescriptor invoke() {
return computePrimaryConstructor();
}
});
- this.classObjectDescriptor = storageManager.createNullableLazyValue(new Function0() {
+ this.classObjectDescriptor = context.getStorageManager().createNullableLazyValue(new Function0() {
@Override
public ClassDescriptor invoke() {
return computeClassObjectDescriptor();
@@ -148,12 +135,13 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
@NotNull
private DeclarationDescriptor computeContainingDeclaration() {
if (classId.isTopLevelClass()) {
- List fragments = packageFragmentProvider.getPackageFragments(classId.getPackageFqName());
+ List fragments =
+ context.getPackageFragmentProvider().getPackageFragments(classId.getPackageFqName());
assert fragments.size() == 1 : "there should be exactly one package: " + fragments;
return fragments.iterator().next();
}
else {
- ClassOrPackageFragmentDescriptor result = descriptorFinder.findClass(classId.getOuterClassId());
+ ClassDescriptor result = context.getDescriptorFinder().findClass(classId.getOuterClassId());
return result != null ? result : ErrorUtils.getErrorModule();
}
}
@@ -192,7 +180,7 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
if (!Flags.HAS_ANNOTATIONS.get(classProto.getFlags())) {
return Annotations.EMPTY;
}
- return deserializers.getAnnotationDeserializer().loadClassAnnotations(this, classProto);
+ return context.getAnnotationLoader().loadClassAnnotations(this, classProto);
}
@NotNull
@@ -218,7 +206,7 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
return descriptor;
}
- return (ConstructorDescriptor) deserializer.loadCallable(constructorProto.getData());
+ return (ConstructorDescriptor) context.getDeserializer().loadCallable(constructorProto.getData());
}
@Nullable
@@ -254,11 +242,10 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
throw new IllegalStateException("Object should have a serialized class object: " + classId);
}
- return new DeserializedClassDescriptor(storageManager, deserializers, descriptorFinder, packageFragmentProvider,
- deserializer.getNameResolver(), classObjectProto.getData());
+ return new DeserializedClassDescriptor(context, classObjectProto.getData());
}
- return descriptorFinder.findClass(classId.createNestedClassId(getClassObjectName(getName())));
+ return context.getDescriptorFinder().findClass(classId.createNestedClassId(getClassObjectName(getName())));
}
@NotNull
@@ -313,7 +300,7 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
private Collection computeSuperTypes() {
List supertypes = new ArrayList(classProto.getSupertypeCount());
for (ProtoBuf.Type supertype : classProto.getSupertypeList()) {
- supertypes.add(typeDeserializer.type(supertype));
+ supertypes.add(context.getTypeDeserializer().type(supertype));
}
return supertypes;
}
@@ -384,12 +371,12 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
}
}
- private static class DeserializedClassMemberScope extends DeserializedMemberScope {
+ private class DeserializedClassMemberScope extends DeserializedMemberScope {
private final DeserializedClassDescriptor classDescriptor;
- public DeserializedClassMemberScope(@NotNull StorageManager storageManager, @NotNull DeserializedClassDescriptor classDescriptor) {
- super(storageManager, classDescriptor, classDescriptor.deserializer, classDescriptor.classProto.getMemberList());
- this.classDescriptor = classDescriptor;
+ public DeserializedClassMemberScope() {
+ super(context, DeserializedClassDescriptor.this.classProto.getMemberList());
+ this.classDescriptor = DeserializedClassDescriptor.this;
}
@Override
@@ -485,6 +472,7 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
this.nestedClassNames = nestedClassNames();
this.enumEntryNames = enumEntryNames();
+ final StorageManager storageManager = context.getStorageManager();
final NotNullLazyValue> enumMemberNames = storageManager.createLazyValue(new Function0>() {
@Override
public Collection invoke() {
@@ -500,7 +488,7 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
.create(storageManager, DeserializedClassDescriptor.this, name, enumMemberNames);
}
if (nestedClassNames.contains(name)) {
- return descriptorFinder.findClass(classId.createNestedClassId(name));
+ return context.getDescriptorFinder().findClass(classId.createNestedClassId(name));
}
return null;
}
@@ -510,7 +498,7 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
@NotNull
private Set nestedClassNames() {
Set result = new HashSet();
- NameResolver nameResolver = deserializer.getNameResolver();
+ NameResolver nameResolver = context.getNameResolver();
for (Integer index : classProto.getNestedClassNameList()) {
result.add(nameResolver.getName(index));
}
@@ -524,7 +512,7 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
}
Set result = new HashSet();
- NameResolver nameResolver = deserializer.getNameResolver();
+ NameResolver nameResolver = context.getNameResolver();
for (Integer index : classProto.getEnumEntryList()) {
result.add(nameResolver.getName(index));
}
@@ -543,7 +531,7 @@ public class DeserializedClassDescriptor extends AbstractClassDescriptor impleme
}
}
- final NameResolver nameResolver = deserializer.getNameResolver();
+ final NameResolver nameResolver = context.getNameResolver();
return KotlinPackage.mapTo(classProto.getMemberList(), result, new Function1() {
@Override
public Name invoke(@NotNull ProtoBuf.Callable callable) {
diff --git a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.java b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.java
index 035de4cc5f5..81026e5b420 100644
--- a/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.java
+++ b/core/serialization/src/org/jetbrains/jet/descriptors/serialization/descriptors/DeserializedMemberScope.java
@@ -21,9 +21,9 @@ import kotlin.Function1;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.ReadOnly;
-import org.jetbrains.jet.descriptors.serialization.DescriptorDeserializer;
import org.jetbrains.jet.descriptors.serialization.Flags;
import org.jetbrains.jet.descriptors.serialization.ProtoBuf;
+import org.jetbrains.jet.descriptors.serialization.context.DeserializationContextWithTypes;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
@@ -50,24 +50,20 @@ public abstract class DeserializedMemberScope implements JetScope {
}
};
- private final DeclarationDescriptor containingDeclaration;
- private final DescriptorDeserializer deserializer;
-
private final NotNullLazyValue