diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/TypeParameterDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/TypeParameterDescriptor.java index 7e2d540afb1..73ce42da79c 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/TypeParameterDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/TypeParameterDescriptor.java @@ -2,6 +2,8 @@ package org.jetbrains.jet.lang.descriptors; import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.resolve.JetScope; +import org.jetbrains.jet.lang.resolve.LazyScopeAdapter; import org.jetbrains.jet.lang.types.*; import java.util.Collections; @@ -115,7 +117,12 @@ public class TypeParameterDescriptor extends DeclarationDescriptorImpl implement getTypeConstructor(), TypeUtils.hasNullableBound(this), Collections.emptyList(), - getBoundsAsType().getMemberScope()); + new LazyScopeAdapter(new LazyValue() { + @Override + protected JetScope compute() { + return getBoundsAsType().getMemberScope(); + } + })); } return type; } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/AbstractScopeAdapter.java b/idea/src/org/jetbrains/jet/lang/resolve/AbstractScopeAdapter.java new file mode 100644 index 00000000000..e12f17d9a6a --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/resolve/AbstractScopeAdapter.java @@ -0,0 +1,60 @@ +package org.jetbrains.jet.lang.resolve; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.types.JetType; + +import java.util.Collection; + +/** + * @author abreslav + */ +public abstract class AbstractScopeAdapter implements JetScope { + @NotNull + protected abstract JetScope getWorkerScope(); + + @NotNull + @Override + public JetType getThisType() { + return getWorkerScope().getThisType(); + } + + @NotNull + @Override + public FunctionGroup getFunctionGroup(@NotNull String name) { + return getWorkerScope().getFunctionGroup(name); + } + + @Override + public NamespaceDescriptor getNamespace(@NotNull String name) { + return getWorkerScope().getNamespace(name); + } + + @Override + public ClassifierDescriptor getClassifier(@NotNull String name) { + return getWorkerScope().getClassifier(name); + } + + @Override + public VariableDescriptor getVariable(@NotNull String name) { + return getWorkerScope().getVariable(name); + } + + @NotNull + @Override + public DeclarationDescriptor getContainingDeclaration() { + return getWorkerScope().getContainingDeclaration(); + } + + @NotNull + @Override + public Collection getDeclarationsByLabel(String labelName) { + return getWorkerScope().getDeclarationsByLabel(labelName); + } + + @Override + public PropertyDescriptor getPropertyByFieldReference(@NotNull String fieldName) { + return getWorkerScope().getPropertyByFieldReference(fieldName); + } + +} diff --git a/idea/src/org/jetbrains/jet/lang/resolve/JetScopeAdapter.java b/idea/src/org/jetbrains/jet/lang/resolve/JetScopeAdapter.java index de7c5d0d2aa..a3b531bd831 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/JetScopeAdapter.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/JetScopeAdapter.java @@ -1,15 +1,11 @@ package org.jetbrains.jet.lang.resolve; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.types.*; - -import java.util.Collection; /** * @author abreslav */ -public class JetScopeAdapter implements JetScope { +public class JetScopeAdapter extends AbstractScopeAdapter { @NotNull private final JetScope scope; @@ -18,51 +14,8 @@ public class JetScopeAdapter implements JetScope { } @NotNull + @Override protected final JetScope getWorkerScope() { return scope; } - - @NotNull - @Override - public JetType getThisType() { - return scope.getThisType(); - } - - @NotNull - @Override - public FunctionGroup getFunctionGroup(@NotNull String name) { - return scope.getFunctionGroup(name); - } - - @Override - public NamespaceDescriptor getNamespace(@NotNull String name) { - return scope.getNamespace(name); - } - - @Override - public ClassifierDescriptor getClassifier(@NotNull String name) { - return scope.getClassifier(name); - } - - @Override - public VariableDescriptor getVariable(@NotNull String name) { - return scope.getVariable(name); - } - - @NotNull - @Override - public DeclarationDescriptor getContainingDeclaration() { - return scope.getContainingDeclaration(); - } - - @NotNull - @Override - public Collection getDeclarationsByLabel(String labelName) { - return scope.getDeclarationsByLabel(labelName); - } - - @Override - public PropertyDescriptor getPropertyByFieldReference(@NotNull String fieldName) { - return scope.getPropertyByFieldReference(fieldName); - } } \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/lang/resolve/LazyScopeAdapter.java b/idea/src/org/jetbrains/jet/lang/resolve/LazyScopeAdapter.java new file mode 100644 index 00000000000..40a39ff5ca7 --- /dev/null +++ b/idea/src/org/jetbrains/jet/lang/resolve/LazyScopeAdapter.java @@ -0,0 +1,22 @@ +package org.jetbrains.jet.lang.resolve; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.types.LazyValue; + +/** + * @author abreslav + */ +public class LazyScopeAdapter extends AbstractScopeAdapter { + + private final LazyValue scope; + + public LazyScopeAdapter(LazyValue scope) { + this.scope = scope; + } + + @NotNull + @Override + protected JetScope getWorkerScope() { + return scope.get(); + } +} diff --git a/idea/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/idea/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 421fec69879..43dcbea5c54 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -141,6 +141,7 @@ public class JavaDescriptorResolver { typeParameter.getName(), typeParameter.getIndex() ); + typeParameterDescriptorCache.put(typeParameter, typeParameterDescriptor); PsiClassType[] referencedTypes = typeParameter.getExtendsList().getReferencedTypes(); if (referencedTypes.length == 0){ typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType()); @@ -161,7 +162,7 @@ public class JavaDescriptorResolver { TypeParameterDescriptor typeParameterDescriptor = typeParameterDescriptorCache.get(psiTypeParameter); if (typeParameterDescriptor == null) { typeParameterDescriptor = createJavaTypeParameterDescriptor(JAVA_ROOT, psiTypeParameter); - typeParameterDescriptorCache.put(psiTypeParameter, typeParameterDescriptor); +// Tis is done inside the method: typeParameterDescriptorCache.put(psiTypeParameter, typeParameterDescriptor); } return typeParameterDescriptor; }