Remove PSI usages from ScriptDescriptor

This commit is contained in:
Alexander Udalov
2013-08-22 17:25:48 +04:00
parent d0a9464504
commit cb10cbdf7a
5 changed files with 61 additions and 34 deletions
@@ -34,7 +34,6 @@ import org.jetbrains.jet.lang.descriptors.ScriptDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.ScriptNameUtil;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import javax.inject.Inject;
@@ -106,7 +105,7 @@ public class ScriptCodegen extends MemberCodegen {
Type blockType = typeMapper.mapType(scriptDescriptor.getReturnType());
classBuilder.newField(null, ACC_PUBLIC | ACC_FINAL, ScriptNameUtil.LAST_EXPRESSION_VALUE_FIELD_NAME,
classBuilder.newField(null, ACC_PUBLIC | ACC_FINAL, ScriptDescriptor.LAST_EXPRESSION_VALUE_FIELD_NAME,
blockType.getDescriptor(), null, null);
JvmMethodSignature jvmSignature = typeMapper.mapScriptSignature(scriptDescriptor, importedScripts);
@@ -173,7 +172,7 @@ public class ScriptCodegen extends MemberCodegen {
if (stackValue.type != Type.VOID_TYPE) {
stackValue.put(stackValue.type, instructionAdapter);
instructionAdapter
.putfield(className.getInternalName(), ScriptNameUtil.LAST_EXPRESSION_VALUE_FIELD_NAME, blockType.getDescriptor());
.putfield(className.getInternalName(), ScriptDescriptor.LAST_EXPRESSION_VALUE_FIELD_NAME, blockType.getDescriptor());
}
instructionAdapter.areturn(Type.VOID_TYPE);
@@ -17,14 +17,9 @@
package org.jetbrains.jet.lang.descriptors;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.*;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.DescriptorFactory;
import org.jetbrains.jet.lang.resolve.ScriptNameUtil;
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.lang.resolve.scopes.RedeclarationHandler;
@@ -40,6 +35,7 @@ import java.util.HashSet;
import java.util.List;
public class ScriptDescriptor extends DeclarationDescriptorNonRootImpl {
public static final String LAST_EXPRESSION_VALUE_FIELD_NAME = "rv";
private static final Name NAME = Name.special("<script>");
private final int priority;
@@ -59,17 +55,20 @@ public class ScriptDescriptor extends DeclarationDescriptorNonRootImpl {
private final WritableScopeImpl classScope;
public ScriptDescriptor(@Nullable DeclarationDescriptor containingDeclaration, int priority, JetScript script, JetScope scriptScope) {
public ScriptDescriptor(
@NotNull DeclarationDescriptor containingDeclaration,
int priority,
@NotNull JetScope scriptScope,
@NotNull Name className
) {
super(containingDeclaration, Collections.<AnnotationDescriptor>emptyList(), NAME);
this.priority = priority;
String className = ScriptNameUtil.classNameForScript((JetFile) script.getContainingFile()).replace('/','.');
classDescriptor = new ClassDescriptorImpl(
containingDeclaration,
Collections.<AnnotationDescriptor>emptyList(),
Modality.FINAL,
new FqName(className).shortName());
className);
classScope = new WritableScopeImpl(scriptScope, containingDeclaration, RedeclarationHandler.DO_NOTHING, "script members");
classScope.changeLockLevel(WritableScope.LockLevel.BOTH);
classDescriptor.initialize(
@@ -82,7 +81,11 @@ public class ScriptDescriptor extends DeclarationDescriptorNonRootImpl {
false);
}
public void initialize(@NotNull JetType returnType, JetScript declaration, BindingContext bindingContext) {
public void initialize(
@NotNull JetType returnType,
@NotNull List<? extends PropertyDescriptorImpl> properties,
@NotNull List<? extends FunctionDescriptor> functions
) {
this.returnType = returnType;
scriptCodeDescriptor.initialize(implicitReceiver, valueParameters, returnType);
@@ -91,7 +94,7 @@ public class ScriptDescriptor extends DeclarationDescriptorNonRootImpl {
Modality.FINAL,
Visibilities.PUBLIC,
false,
Name.identifier(ScriptNameUtil.LAST_EXPRESSION_VALUE_FIELD_NAME),
Name.identifier(LAST_EXPRESSION_VALUE_FIELD_NAME),
CallableMemberDescriptor.Kind.DECLARATION);
propertyDescriptor.setType(
returnType,
@@ -101,20 +104,13 @@ public class ScriptDescriptor extends DeclarationDescriptorNonRootImpl {
propertyDescriptor.initialize(null, null);
classScope.addPropertyDescriptor(propertyDescriptor);
for (JetDeclaration jetDeclaration : declaration.getDeclarations()) {
if(jetDeclaration instanceof JetProperty) {
VariableDescriptor descriptor = bindingContext.get(BindingContext.VARIABLE, jetDeclaration);
assert descriptor != null;
initializeWithDefaultGetterSetter((PropertyDescriptorImpl) descriptor);
classScope.addPropertyDescriptor(descriptor);
}
else if(jetDeclaration instanceof JetNamedFunction) {
SimpleFunctionDescriptor descriptor = bindingContext.get(BindingContext.FUNCTION, jetDeclaration);
assert descriptor != null;
SimpleFunctionDescriptor copy =
descriptor.copy(classDescriptor, descriptor.getModality(), descriptor.getVisibility(), CallableMemberDescriptor.Kind.DECLARATION, false);
classScope.addFunctionDescriptor(copy);
}
for (PropertyDescriptorImpl property : properties) {
initializeWithDefaultGetterSetter(property);
classScope.addPropertyDescriptor(property);
}
for (FunctionDescriptor function : functions) {
classScope.addFunctionDescriptor(function);
}
}
@@ -195,6 +191,7 @@ public class ScriptDescriptor extends DeclarationDescriptorNonRootImpl {
}
}
@NotNull
public ClassDescriptor getClassDescriptor() {
return classDescriptor;
}
@@ -17,7 +17,13 @@
package org.jetbrains.jet.lang.resolve;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
import org.jetbrains.jet.lang.descriptors.ScriptDescriptor;
import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.PropertyDescriptorImpl;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.JetNamedFunction;
import org.jetbrains.jet.lang.psi.JetProperty;
import org.jetbrains.jet.lang.psi.JetScript;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.calls.context.ExpressionPosition;
@@ -29,6 +35,8 @@ import org.jetbrains.jet.lang.types.expressions.ExpressionTypingContext;
import org.jetbrains.jet.lang.types.expressions.ExpressionTypingServices;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static org.jetbrains.jet.lang.types.TypeUtils.NO_EXPECTED_TYPE;
@@ -79,7 +87,24 @@ public class ScriptBodyResolver {
if (returnType == null) {
returnType = ErrorUtils.createErrorType("getBlockReturnedType returned null");
}
descriptor.initialize(returnType, declaration, trace.getBindingContext());
List<PropertyDescriptorImpl> properties = new ArrayList<PropertyDescriptorImpl>();
List<SimpleFunctionDescriptor> functions = new ArrayList<SimpleFunctionDescriptor>();
BindingContext bindingContext = trace.getBindingContext();
for (JetDeclaration jetDeclaration : declaration.getDeclarations()) {
if (jetDeclaration instanceof JetProperty) {
properties.add((PropertyDescriptorImpl) bindingContext.get(BindingContext.VARIABLE, jetDeclaration));
}
else if (jetDeclaration instanceof JetNamedFunction) {
SimpleFunctionDescriptor function = bindingContext.get(BindingContext.FUNCTION, jetDeclaration);
assert function != null;
functions.add(function.copy(descriptor.getClassDescriptor(), function.getModality(), function.getVisibility(),
CallableMemberDescriptor.Kind.DECLARATION, false));
}
}
descriptor.initialize(returnType, properties, functions);
}
}
@@ -19,7 +19,9 @@ package org.jetbrains.jet.lang.resolve;
import com.google.common.collect.Lists;
import com.intellij.openapi.util.Key;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ScriptDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.descriptors.impl.NamespaceDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl;
@@ -29,6 +31,7 @@ import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetNamespaceHeader;
import org.jetbrains.jet.lang.psi.JetScript;
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.lang.resolve.scopes.RedeclarationHandler;
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
@@ -39,7 +42,10 @@ import org.jetbrains.jet.lang.types.TypeUtils;
import org.jetbrains.jet.lang.types.ref.JetTypeName;
import javax.inject.Inject;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class ScriptHeaderResolver {
@@ -122,7 +128,9 @@ public class ScriptHeaderResolver {
priority = 0;
}
ScriptDescriptor scriptDescriptor = new ScriptDescriptor(ns, priority, script, outerScope);
Name className = new FqName(ScriptNameUtil.classNameForScript((JetFile) script.getContainingFile()).replace('/', '.')).shortName();
ScriptDescriptor scriptDescriptor = new ScriptDescriptor(ns, priority, outerScope, className);
//WriteThroughScope scriptScope = new WriteThroughScope(
// outerScope, ns.getMemberScope(), new TraceBasedRedeclarationHandler(trace));
WritableScopeImpl scriptScope = new WritableScopeImpl(outerScope, scriptDescriptor, RedeclarationHandler.DO_NOTHING, "script");
@@ -22,8 +22,6 @@ import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.psi.JetNamespaceHeader;
public class ScriptNameUtil {
public static final String LAST_EXPRESSION_VALUE_FIELD_NAME = "rv";
private ScriptNameUtil() {
}