diff --git a/compiler/frontend/src/org/jetbrains/kotlin/KtNodeTypes.java b/compiler/frontend/src/org/jetbrains/kotlin/KtNodeTypes.java index 9abffb18a76..2d0f5dcf612 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/KtNodeTypes.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/KtNodeTypes.java @@ -154,7 +154,7 @@ public interface KtNodeTypes { IElementType PACKAGE_DIRECTIVE = KtStubElementTypes.PACKAGE_DIRECTIVE; - KtNodeType SCRIPT = new KtNodeType("SCRIPT", KtScript.class); + IElementType SCRIPT = KtStubElementTypes.SCRIPT; IFileElementType TYPE_CODE_FRAGMENT = new KtTypeCodeFragmentType(); IFileElementType EXPRESSION_CODE_FRAGMENT = new KtExpressionCodeFragmentType(); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtScript.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtScript.java index 5d30a736662..cd7a13e1a33 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtScript.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtScript.java @@ -19,15 +19,39 @@ package org.jetbrains.kotlin.psi; import com.intellij.lang.ASTNode; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.name.FqName; +import org.jetbrains.kotlin.name.Name; +import org.jetbrains.kotlin.psi.stubs.KotlinScriptStub; +import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes; +import org.jetbrains.kotlin.resolve.ScriptNameUtil; import java.util.List; -public class KtScript extends KtDeclarationImpl implements KtDeclarationContainer { +public class KtScript extends KtNamedDeclarationStub implements KtDeclarationContainer { public KtScript(@NotNull ASTNode node) { super(node); } + public KtScript(@NotNull KotlinScriptStub stub) { + super(stub, KtStubElementTypes.SCRIPT); + } + + @NotNull + @Override + public FqName getFqName() { + KotlinScriptStub stub = getStub(); + if (stub != null) { + return stub.getFqName(); + } + return ScriptNameUtil.classNameForScript(this); + } + + @Override + public String getName() { + return getFqName().shortName().asString(); + } + @NotNull public KtBlockExpression getBlockExpression() { return findNotNullChildByClass(KtBlockExpression.class); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/StubInterfaces.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/StubInterfaces.kt index 2972239b1c5..fec9122ea66 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/StubInterfaces.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/StubInterfaces.kt @@ -124,3 +124,7 @@ public interface KotlinTypeProjectionStub : StubElement { public interface KotlinUserTypeStub : StubElement { public fun isAbsoluteInRootPackage(): Boolean } + +public interface KotlinScriptStub : KotlinStubWithFqName { + override fun getFqName(): FqName +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/elements/KtScriptElementType.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/elements/KtScriptElementType.kt new file mode 100644 index 00000000000..b3ffc80ea92 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/elements/KtScriptElementType.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2010-2015 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.kotlin.psi.stubs.elements + +import com.intellij.psi.PsiElement +import com.intellij.psi.stubs.IndexSink +import com.intellij.psi.stubs.StubElement +import com.intellij.psi.stubs.StubInputStream +import com.intellij.psi.stubs.StubOutputStream +import com.intellij.util.io.StringRef +import org.jetbrains.kotlin.psi.KtScript +import org.jetbrains.kotlin.psi.stubs.KotlinScriptStub +import org.jetbrains.kotlin.psi.stubs.impl.KotlinScriptStubImpl + +public class KtScriptElementType(debugName: String) : KtStubElementType( + debugName, KtScript::class.java, KotlinScriptStub::class.java +) { + + override fun createStub(psi: KtScript, parentStub: StubElement): KotlinScriptStub { + return KotlinScriptStubImpl(parentStub, StringRef.fromString(psi.fqName.asString())) + } + + override fun serialize(stub: KotlinScriptStub, dataStream: StubOutputStream) { + dataStream.writeName(stub.getFqName().asString()) + } + + override fun deserialize(dataStream: StubInputStream, parentStub: StubElement): KotlinScriptStub { + val fqName = dataStream.readName() + return KotlinScriptStubImpl(parentStub, fqName) + } + + + override fun indexStub(stub: KotlinScriptStub, sink: IndexSink) { + StubIndexService.getInstance().indexScript(stub, sink) + } +} diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/elements/KtStubElementTypes.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/elements/KtStubElementTypes.java index 93ac5c40b0d..bb1a722ea2d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/elements/KtStubElementTypes.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/elements/KtStubElementTypes.java @@ -116,6 +116,8 @@ public interface KtStubElementTypes { KtPlaceHolderStubElementType CONSTRUCTOR_CALLEE = new KtPlaceHolderStubElementType("CONSTRUCTOR_CALLEE", KtConstructorCalleeExpression.class); + KtScriptElementType SCRIPT = new KtScriptElementType("SCRIPT"); + TokenSet DECLARATION_TYPES = TokenSet.create(CLASS, OBJECT_DECLARATION, FUNCTION, PROPERTY, ANONYMOUS_INITIALIZER, SECONDARY_CONSTRUCTOR, ENUM_ENTRY); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/elements/StubIndexService.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/elements/StubIndexService.kt index c4212145576..5fbd3c06833 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/elements/StubIndexService.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/elements/StubIndexService.kt @@ -44,6 +44,9 @@ public open class StubIndexService protected constructor() { public open fun indexAnnotation(stub: KotlinAnnotationEntryStub, sink: IndexSink) { } + public open fun indexScript(stub: KotlinScriptStub, sink: IndexSink) { + } + public open fun createFileStub(file: KtFile): KotlinFileStub { return KotlinFileStubImpl(file, file.packageFqNameByTree.asString(), file.isScriptByTree) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/impl/KotlinScriptStubImpl.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/impl/KotlinScriptStubImpl.kt new file mode 100644 index 00000000000..3238135cfa7 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/stubs/impl/KotlinScriptStubImpl.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2015 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.kotlin.psi.stubs.impl + +import com.intellij.psi.PsiElement +import com.intellij.psi.stubs.StubElement +import com.intellij.util.io.StringRef +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.psi.KtScript +import org.jetbrains.kotlin.psi.stubs.KotlinScriptStub +import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes + +public class KotlinScriptStubImpl( + parent: StubElement?, + private val _fqName: StringRef? +) : KotlinStubBaseImpl(parent, KtStubElementTypes.SCRIPT), KotlinScriptStub { + override fun getName(): String = getFqName().shortName().asString() + + override fun getFqName(): FqName = FqName(StringRef.toString(_fqName)!!) +} diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/IdeStubIndexService.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/IdeStubIndexService.java index 329cdbe1802..85f8f6c5880 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/IdeStubIndexService.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/IdeStubIndexService.java @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.KtClassOrObject; import org.jetbrains.kotlin.psi.KtFile; +import org.jetbrains.kotlin.psi.KtScript; import org.jetbrains.kotlin.psi.stubs.*; import org.jetbrains.kotlin.psi.stubs.elements.StubIndexService; import org.jetbrains.kotlin.util.TypeIndexUtilKt; @@ -187,6 +188,11 @@ public class IdeStubIndexService extends StubIndexService { return null; } + @Override + public void indexScript(@NotNull KotlinScriptStub stub, @NotNull IndexSink sink) { + sink.occurrence(KotlinScriptFqnIndex.getInstance().getKey(), stub.getFqName().asString()); + } + @NotNull @Override public KotlinFileStub createFileStub(@NotNull KtFile file) { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/KotlinScriptFqnIndex.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/KotlinScriptFqnIndex.kt new file mode 100644 index 00000000000..3af86d4e3ce --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/KotlinScriptFqnIndex.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2010-2015 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.kotlin.idea.stubindex + +import com.intellij.openapi.project.Project +import com.intellij.psi.search.GlobalSearchScope +import com.intellij.psi.stubs.StringStubIndexExtension +import org.jetbrains.kotlin.psi.KtScript + +class KotlinScriptFqnIndex private constructor() : StringStubIndexExtension() { + override fun getKey() = KEY + + override fun get(fqName: String, project: Project, scope: GlobalSearchScope): Collection { + return super.get(fqName, project, KotlinSourceFilterScope.sourcesAndLibraries(scope, project)) + } + + companion object { + private val KEY = KotlinIndexUtil.createIndexKey(KotlinScriptFqnIndex::class.java) + + @JvmStatic + val instance = KotlinScriptFqnIndex() + } +} \ No newline at end of file diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 33f9bedc22a..d6a316d438a 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -562,6 +562,7 @@ +