From 7bdc56d895d9040cfc06c921e30ce9cf5f36d15e Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Sat, 29 Mar 2014 19:17:34 +0400 Subject: [PATCH] Script-related code extracted to subclasses --- .../descriptors/AbstractLazyMemberScope.java | 13 ++- .../lazy/descriptors/LazyClassDescriptor.java | 15 ++-- .../descriptors/LazyClassMemberScope.java | 86 ++++++++----------- .../LazyScriptClassDescriptor.java | 49 +++++++++++ .../LazyScriptClassMemberScope.java | 84 ++++++++++++++++++ 5 files changed, 180 insertions(+), 67 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyScriptClassDescriptor.java create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyScriptClassMemberScope.java diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java index 36569f24f8e..b645affdbe6 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/AbstractLazyMemberScope.java @@ -26,7 +26,6 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingTrace; -import org.jetbrains.jet.lang.resolve.TemporaryBindingTrace; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo; @@ -111,13 +110,11 @@ public abstract class AbstractLazyMemberScope() { @Override public ClassDescriptor fun(JetClassLikeInfo classLikeInfo) { - BindingTrace traceForMembers = classLikeInfo instanceof JetScriptInfo - ? TemporaryBindingTrace.create( - resolveSession.getTrace(), - "A trace for script class, needed to avoid rewrites on members" - ) - : resolveSession.getTrace(); - return new LazyClassDescriptor(resolveSession, thisDescriptor, name, classLikeInfo, traceForMembers); + // SCRIPT: Creating a script class + if (classLikeInfo instanceof JetScriptInfo) { + return new LazyScriptClassDescriptor(resolveSession, thisDescriptor, name, (JetScriptInfo) classLikeInfo); + } + return new LazyClassDescriptor(resolveSession, thisDescriptor, name, classLikeInfo); } }); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java index 18f820cc6d7..ae886ba27be 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassDescriptor.java @@ -91,8 +91,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes @NotNull ResolveSession resolveSession, @NotNull DeclarationDescriptor containingDeclaration, @NotNull Name name, - @NotNull JetClassLikeInfo classLikeInfo, - @NotNull BindingTrace traceForMembers // = resolveSession.getTrace() + @NotNull JetClassLikeInfo classLikeInfo ) { super(resolveSession.getStorageManager(), containingDeclaration, name); this.resolveSession = resolveSession; @@ -105,7 +104,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes this.originalClassInfo = classLikeInfo; this.declarationProvider = resolveSession.getDeclarationProviderFactory().getClassMemberDeclarationProvider(classLikeInfo); - this.unsubstitutedMemberScope = new LazyClassMemberScope(resolveSession, declarationProvider, this, traceForMembers); + this.unsubstitutedMemberScope = createMemberScope(resolveSession, this.declarationProvider); this.typeConstructor = new LazyClassTypeConstructor(); @@ -164,13 +163,13 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes }, null); } - public LazyClassDescriptor( + // NOTE: Called from constructor! + @NotNull + protected LazyClassMemberScope createMemberScope( @NotNull ResolveSession resolveSession, - @NotNull DeclarationDescriptor containingDeclaration, - @NotNull Name name, - @NotNull JetClassLikeInfo classLikeInfo + @NotNull ClassMemberDeclarationProvider declarationProvider ) { - this(resolveSession, containingDeclaration, name, classLikeInfo, resolveSession.getTrace()); + return new LazyClassMemberScope(resolveSession, declarationProvider, this, resolveSession.getTrace()); } @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java index 9c6262c0ef6..af0869024bf 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyClassMemberScope.java @@ -28,7 +28,6 @@ import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo; -import org.jetbrains.jet.lang.resolve.lazy.data.JetScriptInfo; import org.jetbrains.jet.lang.resolve.lazy.declarations.ClassMemberDeclarationProvider; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.scopes.JetScope; @@ -221,44 +220,7 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope result) { - JetClassLikeInfo classInfo = declarationProvider.getOwnerInfo(); - - // From primary constructor parameters - ConstructorDescriptor primaryConstructor = getPrimaryConstructor(); - if (primaryConstructor != null) { - List valueParameterDescriptors = primaryConstructor.getValueParameters(); - List primaryConstructorParameters = classInfo.getPrimaryConstructorParameters(); - for (ValueParameterDescriptor valueParameterDescriptor : valueParameterDescriptors) { - if (!name.equals(valueParameterDescriptor.getName())) continue; - - // SCRIPT: Adding script parameters as properties - if (classInfo instanceof JetScriptInfo) { - result.add(ScriptDescriptorImpl.createPropertyFromScriptParameter( - resolveSession.getScriptDescriptor(((JetScriptInfo) classInfo).getScript()), valueParameterDescriptor) - ); - continue; - } - - assert valueParameterDescriptors.size() == primaryConstructorParameters.size() : "From descriptor: " + valueParameterDescriptors.size() + " but from PSI: " + primaryConstructorParameters.size(); - JetParameter parameter = primaryConstructorParameters.get(valueParameterDescriptor.getIndex()); - if (parameter.getValOrVarNode() != null) { - PropertyDescriptor propertyDescriptor = - resolveSession.getDescriptorResolver().resolvePrimaryConstructorParameterToAProperty( - thisDescriptor, - valueParameterDescriptor, - thisDescriptor.getScopeForClassHeaderResolution(), - parameter, trace - ); - result.add(propertyDescriptor); - } - } - } - - // SCRIPT: Adding script result - if (classInfo instanceof JetScriptInfo && name.asString().equals(ScriptDescriptor.LAST_EXPRESSION_VALUE_FIELD_NAME)) { - JetScriptInfo scriptInfo = (JetScriptInfo) classInfo; - result.add(ScriptDescriptorImpl.createScriptResultProperty(resolveSession.getScriptDescriptor(scriptInfo.getScript()))); - } + createPropertiesFromPrimaryConstructorParameters(name, result); // Members from supertypes Collection fromSupertypes = Lists.newArrayList(); @@ -269,6 +231,35 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope result) { + JetClassLikeInfo classInfo = declarationProvider.getOwnerInfo(); + + // From primary constructor parameters + ConstructorDescriptor primaryConstructor = getPrimaryConstructor(); + if (primaryConstructor == null) return; + + List valueParameterDescriptors = primaryConstructor.getValueParameters(); + List primaryConstructorParameters = classInfo.getPrimaryConstructorParameters(); + assert valueParameterDescriptors.size() == primaryConstructorParameters.size() + : "From descriptor: " + valueParameterDescriptors.size() + " but from PSI: " + primaryConstructorParameters.size(); + + for (ValueParameterDescriptor valueParameterDescriptor : valueParameterDescriptors) { + if (!name.equals(valueParameterDescriptor.getName())) continue; + + JetParameter parameter = primaryConstructorParameters.get(valueParameterDescriptor.getIndex()); + if (parameter.getValOrVarNode() != null) { + PropertyDescriptor propertyDescriptor = + resolveSession.getDescriptorResolver().resolvePrimaryConstructorParameterToAProperty( + thisDescriptor, + valueParameterDescriptor, + thisDescriptor.getScopeForClassHeaderResolution(), + parameter, trace + ); + result.add(propertyDescriptor); + } + } + } + @NotNull private Collection generateDelegatingDescriptors( @NotNull final Name name, @@ -372,26 +363,19 @@ public class LazyClassMemberScope extends AbstractLazyMemberScope() { @Override diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyScriptClassDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyScriptClassDescriptor.java new file mode 100644 index 00000000000..363a31cc102 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyScriptClassDescriptor.java @@ -0,0 +1,49 @@ +/* + * 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.lazy.descriptors; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; +import org.jetbrains.jet.lang.resolve.TemporaryBindingTrace; +import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; +import org.jetbrains.jet.lang.resolve.lazy.data.JetScriptInfo; +import org.jetbrains.jet.lang.resolve.lazy.declarations.ClassMemberDeclarationProvider; +import org.jetbrains.jet.lang.resolve.name.Name; + +public class LazyScriptClassDescriptor extends LazyClassDescriptor { + public LazyScriptClassDescriptor( + @NotNull ResolveSession resolveSession, + @NotNull DeclarationDescriptor containingDeclaration, + @NotNull Name name, + @NotNull JetScriptInfo scriptInfo + ) { + super(resolveSession, containingDeclaration, name, scriptInfo); + } + + @NotNull + @Override + protected LazyClassMemberScope createMemberScope( + @NotNull ResolveSession resolveSession, @NotNull ClassMemberDeclarationProvider declarationProvider + ) { + return new LazyScriptClassMemberScope( + resolveSession, + declarationProvider, + this, + TemporaryBindingTrace.create(resolveSession.getTrace(), "A trace for script class, needed to avoid rewrites on members") + ); + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyScriptClassMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyScriptClassMemberScope.java new file mode 100644 index 00000000000..9a8cb33ac9c --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/descriptors/LazyScriptClassMemberScope.java @@ -0,0 +1,84 @@ +/* + * 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.lazy.descriptors; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.*; +import org.jetbrains.jet.lang.descriptors.impl.ConstructorDescriptorImpl; +import org.jetbrains.jet.lang.resolve.BindingTrace; +import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; +import org.jetbrains.jet.lang.resolve.lazy.data.JetScriptInfo; +import org.jetbrains.jet.lang.resolve.lazy.declarations.ClassMemberDeclarationProvider; +import org.jetbrains.jet.lang.resolve.name.Name; + +import java.util.Set; + +// SCRIPT: Members of a script class +public class LazyScriptClassMemberScope extends LazyClassMemberScope { + protected LazyScriptClassMemberScope( + @NotNull ResolveSession resolveSession, + @NotNull ClassMemberDeclarationProvider declarationProvider, + @NotNull LazyClassDescriptor thisClass, + @NotNull BindingTrace trace + ) { + super(resolveSession, declarationProvider, thisClass, trace); + } + + @Override + protected void getNonDeclaredProperties(@NotNull Name name, @NotNull Set result) { + super.getNonDeclaredProperties(name, result); + + JetScriptInfo scriptInfo = (JetScriptInfo) declarationProvider.getOwnerInfo(); + + if (name.asString().equals(ScriptDescriptor.LAST_EXPRESSION_VALUE_FIELD_NAME)) { + result.add(ScriptDescriptorImpl.createScriptResultProperty(resolveSession.getScriptDescriptor(scriptInfo.getScript()))); + } + } + + @Override + protected void createPropertiesFromPrimaryConstructorParameters(@NotNull Name name, @NotNull Set result) { + JetScriptInfo scriptInfo = (JetScriptInfo) declarationProvider.getOwnerInfo(); + + // From primary constructor parameters + ConstructorDescriptor primaryConstructor = getPrimaryConstructor(); + if (primaryConstructor == null) return; + + for (ValueParameterDescriptor valueParameterDescriptor : primaryConstructor.getValueParameters()) { + if (!name.equals(valueParameterDescriptor.getName())) continue; + + result.add( + ScriptDescriptorImpl.createPropertyFromScriptParameter( + resolveSession.getScriptDescriptor(scriptInfo.getScript()), + valueParameterDescriptor + ) + ); + } + } + + @Override + @Nullable + protected ConstructorDescriptor resolvePrimaryConstructor() { + JetScriptInfo scriptInfo = (JetScriptInfo) declarationProvider.getOwnerInfo(); + ScriptDescriptor scriptDescriptor = resolveSession.getScriptDescriptor(scriptInfo.getScript()); + ConstructorDescriptorImpl constructor = ScriptDescriptorImpl.createConstructor(scriptDescriptor, + scriptDescriptor.getScriptCodeDescriptor() + .getValueParameters()); + setDeferredReturnType(constructor); + return constructor; + } +}