ScriptDescriptor exposes result property

This commit is contained in:
Andrey Breslav
2014-05-22 07:32:12 +04:00
parent 7b439c2173
commit 9070a6ab37
5 changed files with 47 additions and 9 deletions
@@ -38,7 +38,7 @@ public class LazyScriptClassDescriptor extends LazyClassDescriptor {
@NotNull @NotNull
@Override @Override
protected LazyClassMemberScope createMemberScope( protected LazyScriptClassMemberScope createMemberScope(
@NotNull ResolveSession resolveSession, @NotNull ClassMemberDeclarationProvider declarationProvider @NotNull ResolveSession resolveSession, @NotNull ClassMemberDeclarationProvider declarationProvider
) { ) {
return new LazyScriptClassMemberScope( return new LazyScriptClassMemberScope(
@@ -49,6 +49,12 @@ public class LazyScriptClassDescriptor extends LazyClassDescriptor {
); );
} }
@NotNull
@Override
public LazyScriptClassMemberScope getScopeForMemberLookup() {
return (LazyScriptClassMemberScope) super.getScopeForMemberLookup();
}
@NotNull @NotNull
@Override @Override
public Visibility getVisibility() { public Visibility getVisibility() {
@@ -16,6 +16,7 @@
package org.jetbrains.jet.lang.resolve.lazy.descriptors; package org.jetbrains.jet.lang.resolve.lazy.descriptors;
import kotlin.Function0;
import kotlin.Function1; import kotlin.Function1;
import kotlin.KotlinPackage; import kotlin.KotlinPackage;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -27,19 +28,33 @@ import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
import org.jetbrains.jet.lang.resolve.lazy.data.JetScriptInfo; import org.jetbrains.jet.lang.resolve.lazy.data.JetScriptInfo;
import org.jetbrains.jet.lang.resolve.lazy.declarations.ClassMemberDeclarationProvider; import org.jetbrains.jet.lang.resolve.lazy.declarations.ClassMemberDeclarationProvider;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.storage.NotNullLazyValue;
import java.util.Collection; import java.util.Collection;
import java.util.Set; import java.util.Set;
// SCRIPT: Members of a script class // SCRIPT: Members of a script class
public class LazyScriptClassMemberScope extends LazyClassMemberScope { public class LazyScriptClassMemberScope extends LazyClassMemberScope {
private final NotNullLazyValue<PropertyDescriptor> scriptResultProperty;
protected LazyScriptClassMemberScope( protected LazyScriptClassMemberScope(
@NotNull ResolveSession resolveSession, @NotNull ResolveSession _resolveSession,
@NotNull ClassMemberDeclarationProvider declarationProvider, @NotNull ClassMemberDeclarationProvider _declarationProvider,
@NotNull LazyClassDescriptor thisClass, @NotNull LazyClassDescriptor thisClass,
@NotNull BindingTrace trace @NotNull BindingTrace trace
) { ) {
super(resolveSession, declarationProvider, thisClass, trace); super(_resolveSession, _declarationProvider, thisClass, trace);
this.scriptResultProperty = _resolveSession.getStorageManager().createLazyValue(
new Function0<PropertyDescriptor>() {
@Override
public PropertyDescriptor invoke() {
JetScriptInfo scriptInfo = (JetScriptInfo) declarationProvider.getOwnerInfo();
return ScriptDescriptorImpl.createScriptResultProperty(resolveSession.getScriptDescriptor(scriptInfo.getScript()));
}
}
);
} }
@NotNull @NotNull
@@ -70,13 +85,16 @@ public class LazyScriptClassMemberScope extends LazyClassMemberScope {
protected void getNonDeclaredProperties(@NotNull Name name, @NotNull Set<VariableDescriptor> result) { protected void getNonDeclaredProperties(@NotNull Name name, @NotNull Set<VariableDescriptor> result) {
super.getNonDeclaredProperties(name, result); super.getNonDeclaredProperties(name, result);
JetScriptInfo scriptInfo = (JetScriptInfo) declarationProvider.getOwnerInfo();
if (name.asString().equals(ScriptDescriptor.LAST_EXPRESSION_VALUE_FIELD_NAME)) { if (name.asString().equals(ScriptDescriptor.LAST_EXPRESSION_VALUE_FIELD_NAME)) {
result.add(ScriptDescriptorImpl.createScriptResultProperty(resolveSession.getScriptDescriptor(scriptInfo.getScript()))); result.add(scriptResultProperty.invoke());
} }
} }
@NotNull
public PropertyDescriptor getScriptResultProperty() {
return scriptResultProperty.invoke();
}
@Override @Override
protected void createPropertiesFromPrimaryConstructorParameters(@NotNull Name name, @NotNull Set<VariableDescriptor> result) { protected void createPropertiesFromPrimaryConstructorParameters(@NotNull Name name, @NotNull Set<VariableDescriptor> result) {
JetScriptInfo scriptInfo = (JetScriptInfo) declarationProvider.getOwnerInfo(); JetScriptInfo scriptInfo = (JetScriptInfo) declarationProvider.getOwnerInfo();
@@ -39,6 +39,7 @@ import org.jetbrains.jet.lang.types.TypeSubstitutor
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorVisitor import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorVisitor
import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler
import org.jetbrains.jet.lang.resolve.scopes.WritableScope import org.jetbrains.jet.lang.resolve.scopes.WritableScope
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor
public class LazyScriptDescriptor( public class LazyScriptDescriptor(
val resolveSession: ResolveSession, val resolveSession: ResolveSession,
@@ -64,7 +65,9 @@ public class LazyScriptDescriptor(
override fun getPriority() = _priority override fun getPriority() = _priority
override fun getClassDescriptor() = resolveSession.getClassDescriptorForScript(jetScript) override fun getClassDescriptor() = resolveSession.getClassDescriptorForScript(jetScript) as LazyScriptClassDescriptor
override fun getScriptResultProperty(): PropertyDescriptor = getClassDescriptor().getScopeForMemberLookup().getScriptResultProperty()
private val _scriptCodeDescriptor = resolveSession.getStorageManager().createLazyValue { private val _scriptCodeDescriptor = resolveSession.getStorageManager().createLazyValue {
val result = ScriptCodeDescriptor(this) val result = ScriptCodeDescriptor(this)
@@ -39,4 +39,7 @@ public interface ScriptDescriptor extends Annotated, DeclarationDescriptor, Decl
@NotNull @NotNull
JetScope getScopeForBodyResolution(); JetScope getScopeForBodyResolution();
@NotNull
PropertyDescriptor getScriptResultProperty();
} }
@@ -51,6 +51,7 @@ public class ScriptDescriptorImpl extends DeclarationDescriptorNonRootImpl imple
private final WritableScopeImpl classScope; private final WritableScopeImpl classScope;
private WritableScope scopeForBodyResolution; private WritableScope scopeForBodyResolution;
private PropertyDescriptor scriptResultProperty;
public ScriptDescriptorImpl( public ScriptDescriptorImpl(
@NotNull DeclarationDescriptor containingDeclaration, @NotNull DeclarationDescriptor containingDeclaration,
@@ -81,7 +82,8 @@ public class ScriptDescriptorImpl extends DeclarationDescriptorNonRootImpl imple
assert valueParameters != null : "setValueParameters() must be called before this method"; assert valueParameters != null : "setValueParameters() must be called before this method";
scriptCodeDescriptor.initialize(implicitReceiver, valueParameters, returnType); scriptCodeDescriptor.initialize(implicitReceiver, valueParameters, returnType);
classScope.addPropertyDescriptor(createScriptResultProperty(this)); scriptResultProperty = createScriptResultProperty(this);
classScope.addPropertyDescriptor(scriptResultProperty);
for (PropertyDescriptorImpl property : properties) { for (PropertyDescriptorImpl property : properties) {
classScope.addPropertyDescriptor(property); classScope.addPropertyDescriptor(property);
@@ -112,6 +114,12 @@ public class ScriptDescriptorImpl extends DeclarationDescriptorNonRootImpl imple
return propertyDescriptor; return propertyDescriptor;
} }
@NotNull
@Override
public PropertyDescriptor getScriptResultProperty() {
return scriptResultProperty;
}
@Override @Override
public int getPriority() { public int getPriority() {
return priority; return priority;