diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 21f40a1c88a..540bc9965dd 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -2163,6 +2163,7 @@ public class ExpressionCodegen extends JetVisitor implem } } else if (descriptor instanceof ScriptReceiver) { + // SCRIPT: generate script generateScript((ScriptReceiver) descriptor); } else if (descriptor instanceof ExtensionReceiver) { @@ -2196,6 +2197,7 @@ public class ExpressionCodegen extends JetVisitor implem return context.lookupInContext(provided, StackValue.local(0, OBJECT_TYPE), state, false); } + // SCRIPT: generate script, move to ScriptingUtil private void generateScript(@NotNull ScriptReceiver receiver) { CodegenContext cur = context; StackValue result = StackValue.local(0, OBJECT_TYPE); @@ -3222,6 +3224,7 @@ public class ExpressionCodegen extends JetVisitor implem Type varType = asmType(variableDescriptor.getType()); + // SCRIPT: Variable at the top of the script is generated as field if (JetPsiUtil.isScriptDeclaration(variableDeclaration)) { generateInitializer.fun(variableDescriptor); JetScript scriptPsi = JetPsiUtil.getScript(variableDeclaration); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/KotlinCodegenFacade.java b/compiler/backend/src/org/jetbrains/jet/codegen/KotlinCodegenFacade.java index 65b3c19ebf0..8b3a18ccdad 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/KotlinCodegenFacade.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/KotlinCodegenFacade.java @@ -37,6 +37,7 @@ public class KotlinCodegenFacade { ) { for (JetFile file : state.getFiles()) { if (file.isScript()) { + // SCRIPT: register class name for scripting from this file, move outside of this function String name = ScriptNameUtil.classNameForScript(file); JetScript script = file.getScript(); assert script != null; diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java index c790f5dc867..5819e4ba3c5 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java @@ -145,6 +145,7 @@ public class PackageCodegen extends GenerationStateAware { return; } + // SCRIPT: Do not write annotations for scripts (if any is??) for (JetFile file : files) { if (file.isScript()) return; } @@ -184,6 +185,7 @@ public class PackageCodegen extends GenerationStateAware { } } else if (declaration instanceof JetScript) { + // SCRIPT: generate script code, should be separate execution branch ScriptCodegen.createScriptCodegen((JetScript) declaration, state, packagePartContext).generate(); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ScriptCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ScriptCodegen.java index 47bf7ac338b..319a52ef1d2 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ScriptCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ScriptCodegen.java @@ -40,6 +40,7 @@ import static org.jetbrains.asm4.Opcodes.*; import static org.jetbrains.jet.codegen.binding.CodegenBinding.*; import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.OBJECT_TYPE; +// SCRIPT: script code generator public class ScriptCodegen extends MemberCodegen { public static ScriptCodegen createScriptCodegen( diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenAnnotatingVisitor.java b/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenAnnotatingVisitor.java index 3db9d8707ac..af39cd12ded 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenAnnotatingVisitor.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenAnnotatingVisitor.java @@ -141,6 +141,7 @@ class CodegenAnnotatingVisitor extends JetVisitorVoid { @Override public void visitJetFile(@NotNull JetFile file) { if (file.isScript()) { + // SCRIPT: should be replaced with VisitScript override //noinspection ConstantConditions ClassDescriptor classDescriptor = bindingContext.get(CLASS_FOR_SCRIPT, bindingContext.get(SCRIPT, file.getScript())); pushClassDescriptor(classDescriptor); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java b/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java index 5a144bf273f..8cd5bb8e1d4 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/binding/CodegenBinding.java @@ -79,6 +79,7 @@ public class CodegenBinding { return Boolean.TRUE.equals(bindingContext.get(ENUM_ENTRY_CLASS_NEED_SUBCLASS, classDescriptor)); } + // SCRIPT: Generate asmType for script, move to ScriptingUtil @NotNull public static Type asmTypeForScriptDescriptor(BindingContext bindingContext, @NotNull ScriptDescriptor scriptDescriptor) { ClassDescriptor classDescriptor = bindingContext.get(CLASS_FOR_SCRIPT, scriptDescriptor); @@ -86,6 +87,7 @@ public class CodegenBinding { return asmType(bindingContext, classDescriptor); } + // SCRIPT: Generate asmType for script, move to ScriptingUtil @NotNull public static Type asmTypeForScriptPsi(BindingContext bindingContext, @NotNull JetScript script) { ScriptDescriptor scriptDescriptor = bindingContext.get(SCRIPT, script); @@ -138,6 +140,7 @@ public class CodegenBinding { return asmType(bindingContext, classDescriptor); } + // SCRIPT: register asmType for script descriptor, move to ScriptingUtil public static void registerClassNameForScript( BindingTrace bindingTrace, @NotNull ScriptDescriptor scriptDescriptor, @@ -217,6 +220,7 @@ public class CodegenBinding { innerClasses.add(inner); } + // SCRIPT: register asmType for script, move to ScriptingUtil public static void registerClassNameForScript( BindingTrace bindingTrace, @NotNull JetScript jetScript, @@ -234,6 +238,7 @@ public class CodegenBinding { // todo: we use Set and add given files but ignoring other scripts because something non-clear kept in binding // for scripts especially in case of REPL + // SCRIPT: collect fq names for files that are not scripts HashSet names = new HashSet(); for (JetFile file : files) { if (!file.isScript()) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenContext.java b/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenContext.java index e0377a07b1e..3d0c809e828 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenContext.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenContext.java @@ -197,6 +197,7 @@ public abstract class CodegenContext { return new ConstructorContext(descriptor, getContextKind(), this, closure); } + // SCRIPT: generate into script, move to ScriptingUtil @NotNull public ScriptContext intoScript(@NotNull ScriptDescriptor script, @NotNull ClassDescriptor classDescriptor) { return new ScriptContext(script, classDescriptor, OwnerKind.IMPLEMENTATION, this, closure); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/context/ScriptContext.java b/compiler/backend/src/org/jetbrains/jet/codegen/context/ScriptContext.java index e88efbf9556..91e1351532b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/context/ScriptContext.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/context/ScriptContext.java @@ -23,6 +23,7 @@ import org.jetbrains.jet.codegen.binding.MutableClosure; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ScriptDescriptor; +// SCRIPT: script as field owner context public class ScriptContext extends FieldOwnerContext { @NotNull private final ScriptDescriptor scriptDescriptor; diff --git a/compiler/frontend/src/org/jetbrains/jet/JetNodeTypes.java b/compiler/frontend/src/org/jetbrains/jet/JetNodeTypes.java index 3a814288344..d14e880ac16 100644 --- a/compiler/frontend/src/org/jetbrains/jet/JetNodeTypes.java +++ b/compiler/frontend/src/org/jetbrains/jet/JetNodeTypes.java @@ -146,6 +146,8 @@ public interface JetNodeTypes { JetNodeType WHEN_CONDITION_EXPRESSION = new JetNodeType("WHEN_CONDITION_WITH_EXPRESSION", JetWhenConditionWithExpression.class); JetNodeType PACKAGE_DIRECTIVE = new JetNodeType("PACKAGE_DIRECTIVE", JetPackageDirective.class); + + // SCRIPT: script node type JetNodeType SCRIPT = new JetNodeType("SCRIPT", JetScript.class); IFileElementType TYPE_CODE_FRAGMENT = new JetTypeCodeFragmentType(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetFile.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetFile.java index 3f79c56022e..0712ace76db 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetFile.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetFile.java @@ -129,6 +129,7 @@ public class JetFile extends PsiFileBase implements JetDeclarationContainer, Jet @Override public void setPackageName(String packageName) { } + // SCRIPT: find script in file @Nullable public JetScript getScript() { return PsiTreeUtil.getChildOfType(this, JetScript.class); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java index f684693e762..2c3a2560357 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPsiUtil.java @@ -378,10 +378,12 @@ public class JetPsiUtil { return callOperationNode != null && callOperationNode.getElementType() == JetTokens.SAFE_ACCESS; } + // SCRIPT: is declaration in script? public static boolean isScriptDeclaration(@NotNull JetDeclaration namedDeclaration) { return getScript(namedDeclaration) != null; } + // SCRIPT: get script from top-level declaration @Nullable public static JetScript getScript(@NotNull JetDeclaration namedDeclaration) { PsiElement parent = namedDeclaration.getParent(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetScript.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetScript.java index 7e8b378a0b7..14cbe96c654 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetScript.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetScript.java @@ -24,6 +24,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Collections; import java.util.List; +// SCRIPT: Script declaration public class JetScript extends JetDeclarationImpl { public JetScript(@NotNull ASTNode node) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/impl/PsiJetFileStubImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/impl/PsiJetFileStubImpl.java index 753a1f8f729..899e9215bfe 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/impl/PsiJetFileStubImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/impl/PsiJetFileStubImpl.java @@ -40,6 +40,7 @@ public class PsiJetFileStubImpl extends PsiFileStubImpl implements PsiJ public PsiJetFileStubImpl(JetFile jetFile, @NotNull StringRef packageName, boolean isScript) { super(jetFile); this.packageName = packageName; + // SCRIPT: PsiJetFileStubImpl knows about scripting this.isScript = isScript; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java index 1f20b8019b2..916cbce9d82 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BodyResolver.java @@ -128,6 +128,7 @@ public class BodyResolver { resolveFunctionBodies(c); + // SCRIPT: resolve script bodies scriptBodyResolverResolver.resolveScriptBodies(c); if (!c.getTopDownAnalysisParameters().isDeclaredLocally()) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java index 596d5958ece..f1dbfc5f274 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DeclarationResolver.java @@ -79,6 +79,7 @@ public class DeclarationResolver { this.trace = trace; } + // SCRIPT: inject script header resolver @Inject public void setScriptHeaderResolver(@NotNull ScriptHeaderResolver scriptHeaderResolver) { this.scriptHeaderResolver = scriptHeaderResolver; @@ -149,6 +150,7 @@ public class DeclarationResolver { classDescriptor.getBuilder()); } + // SCRIPT: Resolve script declarations, move outside of this function scriptHeaderResolver.resolveScriptDeclarations(c); // TODO : Extensions diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportsResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportsResolver.java index 0e93e86ecc6..a50adfad09b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportsResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ImportsResolver.java @@ -78,6 +78,7 @@ public class ImportsResolver { WritableScope fileScope = c.getFileScopes().get(file); processImportsInFile(lookupMode, fileScope, Lists.newArrayList(file.getImportDirectives()), file.getPackageFqName().isRoot()); } + // SCRIPT: process script import directives for (JetScript script : c.getScripts().keySet()) { WritableScope scriptScope = c.getScriptScopes().get(script); processImportsInFile(lookupMode, scriptScope, script.getImportDirectives(), true); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptBodyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptBodyResolver.java index 9e9f87dbfee..82824ac4626 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptBodyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptBodyResolver.java @@ -40,6 +40,8 @@ import java.util.Map; import static org.jetbrains.jet.lang.types.TypeUtils.NO_EXPECTED_TYPE; + +// SCRIPT: resolve symbols in scripts public class ScriptBodyResolver { @NotNull diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptHeaderResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptHeaderResolver.java index 1ae03bc9515..4c63a3fe0d5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptHeaderResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/ScriptHeaderResolver.java @@ -46,6 +46,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +// SCRIPT: Resolve declarations in scripts public class ScriptHeaderResolver { public static final Key PRIORITY_KEY = Key.create(JetScript.class.getName() + ".priority"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java index 16963467be8..f3bde641fe8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TopDownAnalyzer.java @@ -327,6 +327,8 @@ public class TopDownAnalyzer { for (ClassDescriptorWithResolutionScopes mutableClassDescriptor : c.getClasses().values()) { ((MutableClassDescriptor) mutableClassDescriptor).lockScopes(); } + + // SCRIPT: extra code for scripts Set scriptFqNames = Sets.newHashSet(); for (JetFile file : c.getFileScopes().keySet()) { if (file.isScript()) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java index da49c82fa02..33f3f98871d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeHierarchyResolver.java @@ -70,6 +70,7 @@ public class TypeHierarchyResolver { this.descriptorResolver = descriptorResolver; } + // SCRIPT: inject script header resolver @Inject public void setScriptHeaderResolver(@NotNull ScriptHeaderResolver scriptHeaderResolver) { this.scriptHeaderResolver = scriptHeaderResolver; @@ -347,6 +348,7 @@ public class TypeHierarchyResolver { c.getFileScopes().put(file, packageScope); if (file.isScript()) { + // SCRIPT: process script hierarchy scriptHeaderResolver.processScriptHierarchy(c, file.getScript(), packageScope); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/DataFlowValueFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/DataFlowValueFactory.java index 8f1f4997eaa..d1cb39aaa77 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/DataFlowValueFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/DataFlowValueFactory.java @@ -60,6 +60,7 @@ public class DataFlowValueFactory { @NotNull public static DataFlowValue createDataFlowValue(@NotNull ReceiverValue receiverValue, @NotNull BindingContext bindingContext) { if (receiverValue instanceof TransientReceiver || receiverValue instanceof ScriptReceiver) { + // SCRIPT: autocasts data flow JetType type = receiverValue.getType(); boolean nullable = type.isNullable() || TypeUtils.hasNullableSuperType(type); return new DataFlowValue(receiverValue, type, nullable, Nullability.NOT_NULL); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingServices.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingServices.java index cc814fdea86..79a6bc3be73 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingServices.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingServices.java @@ -209,6 +209,7 @@ public class ExpressionTypingServices { ) { List block = expression.getStatements(); + // SCRIPT: get code descriptor for script declaration DeclarationDescriptor containingDescriptor = context.scope.getContainingDeclaration(); if (containingDescriptor instanceof ScriptDescriptor) { if (!(expression.getParent() instanceof JetScript)) { diff --git a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestFiles.java b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestFiles.java index 715cd037346..37a6caac12d 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestFiles.java +++ b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestFiles.java @@ -116,6 +116,7 @@ public class CodegenTestFiles { List scriptParameterTypes = Lists.newArrayList(); List scriptParameterValues = Lists.newArrayList(); + // SCRIPT: extract script params, move to ScriptingUtil if (file.isScript()) { Pattern scriptParametersPattern = Pattern.compile("param: (\\S+): (\\S+): (\\S.*)"); Matcher scriptParametersMatcher = scriptParametersPattern.matcher(file.getText()); diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/ScriptDescriptor.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/ScriptDescriptor.java index 3bdc285b5b7..d16f4790705 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/ScriptDescriptor.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/ScriptDescriptor.java @@ -35,6 +35,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; +// SCRIPT: Script declaration descriptor public class ScriptDescriptor extends DeclarationDescriptorNonRootImpl { public static final String LAST_EXPRESSION_VALUE_FIELD_NAME = "rv"; private static final Name NAME = Name.special("