diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetProperty.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetProperty.java index fcf046cf0cc..e89ffdb050d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetProperty.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetProperty.java @@ -74,15 +74,19 @@ public class JetProperty extends JetTypeParameterListOwnerStub { boolean isVar(); - boolean isLocal(); + + boolean isTopLevel(); + + @Nullable + FqName getTopFQName(); + String getTypeText(); String getInferenceBodyText(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetFileElementType.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetFileElementType.java index 8ba2892bfcc..6b9d4210a7a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetFileElementType.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetFileElementType.java @@ -38,7 +38,7 @@ import java.io.IOException; * @author Nikolay Krasko */ public class JetFileElementType extends IStubFileElementType { - public static final int STUB_VERSION = 16; + public static final int STUB_VERSION = 17; public JetFileElementType() { super("jet.FILE", JetLanguage.INSTANCE); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetPropertyElementType.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetPropertyElementType.java index 9b06f792668..c4807159065 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetPropertyElementType.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetPropertyElementType.java @@ -17,6 +17,7 @@ package org.jetbrains.jet.lang.psi.stubs.elements; import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; import com.intellij.psi.stubs.IndexSink; import com.intellij.psi.stubs.StubElement; import com.intellij.psi.stubs.StubInputStream; @@ -26,9 +27,11 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetExpression; import org.jetbrains.jet.lang.psi.JetProperty; +import org.jetbrains.jet.lang.psi.JetPsiUtil; import org.jetbrains.jet.lang.psi.JetTypeReference; import org.jetbrains.jet.lang.psi.stubs.PsiJetPropertyStub; import org.jetbrains.jet.lang.psi.stubs.impl.PsiJetPropertyStubImpl; +import org.jetbrains.jet.lang.resolve.name.FqName; import java.io.IOException; @@ -50,13 +53,28 @@ public class JetPropertyElementType extends JetStubElementType implements PsiJetPropertyStub { private final StringRef name; private final boolean isVar; - private final boolean isLocal; + private final boolean isTopLevel; + private final FqName topFQName; private final StringRef typeText; private final StringRef inferenceBodyText; public PsiJetPropertyStubImpl(IStubElementType elementType, StubElement parent, StringRef name, - boolean isVar, boolean isLocal, StringRef typeText, StringRef inferenceBodyText) { + boolean isVar, boolean isTopLevel, @Nullable FqName topFQName, StringRef typeText, StringRef inferenceBodyText) { super(parent, elementType); + + if (isTopLevel && topFQName == null) { + throw new IllegalArgumentException("topFQName shouldn't be null for top level properties"); + } + this.name = name; this.isVar = isVar; - this.isLocal = isLocal; + this.isTopLevel = isTopLevel; + this.topFQName = topFQName; this.typeText = typeText; this.inferenceBodyText = inferenceBodyText; } public PsiJetPropertyStubImpl(IStubElementType elementType, StubElement parent, String name, - boolean isVal, boolean isLocal, + boolean isVal, boolean isTopLevel, @Nullable FqName topFQName, String typeText, String inferenceBodyText ) { this(elementType, parent, StringRef.fromString(name), - isVal, isLocal, StringRef.fromString(typeText), StringRef.fromString(inferenceBodyText)); + isVal, isTopLevel, topFQName, StringRef.fromString(typeText), StringRef.fromString(inferenceBodyText)); } @Override @@ -57,8 +66,14 @@ public class PsiJetPropertyStubImpl extends StubBase implements Psi } @Override - public boolean isLocal() { - return isLocal; + public boolean isTopLevel() { + return isTopLevel; + } + + @Nullable + @Override + public FqName getTopFQName() { + return topFQName; } @Override @@ -84,8 +99,9 @@ public class PsiJetPropertyStubImpl extends StubBase implements Psi builder.append(isVar() ? "var " : "val "); - if (isLocal()) { - builder.append("local "); + if (isTopLevel()) { + assert topFQName != null; + builder.append("top ").append("topFQName=").append(topFQName.toString()).append(" "); } builder.append("name=").append(getName()); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java index ba699508f52..c81721e2559 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/AbstractLazyMemberScope.java @@ -133,7 +133,7 @@ public abstract class AbstractLazyMemberScope result = Sets.newLinkedHashSet(); - List declarations = declarationProvider.getPropertyDeclarations(name); + Collection declarations = declarationProvider.getPropertyDeclarations(name); for (JetProperty propertyDeclaration : declarations) { JetScope resolutionScope = getScopeForMemberDeclarationResolution(propertyDeclaration); result.add(resolveSession.getInjector().getDescriptorResolver().resolvePropertyDescriptor(thisDescriptor, resolutionScope, diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/DeclarationProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/DeclarationProvider.java index 8537be7eb88..52982f91b7e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/DeclarationProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/lazy/DeclarationProvider.java @@ -37,7 +37,7 @@ public interface DeclarationProvider { Collection getFunctionDeclarations(@NotNull Name name); @NotNull - List getPropertyDeclarations(@NotNull Name name); + Collection getPropertyDeclarations(@NotNull Name name); @Nullable JetClassOrObject getClassOrObjectDeclaration(@NotNull Name name); diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index ca02ac8e8a6..e346e87eeec 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -185,6 +185,7 @@ + diff --git a/idea/src/org/jetbrains/jet/plugin/stubindex/JetIndexKeys.java b/idea/src/org/jetbrains/jet/plugin/stubindex/JetIndexKeys.java index ce711eeec20..70ca0a2f62d 100644 --- a/idea/src/org/jetbrains/jet/plugin/stubindex/JetIndexKeys.java +++ b/idea/src/org/jetbrains/jet/plugin/stubindex/JetIndexKeys.java @@ -19,6 +19,7 @@ package org.jetbrains.jet.plugin.stubindex; import com.intellij.psi.stubs.StubIndexKey; import org.jetbrains.jet.lang.psi.JetClassOrObject; import org.jetbrains.jet.lang.psi.JetNamedFunction; +import org.jetbrains.jet.lang.psi.JetProperty; /** * @author Nikolay Krasko @@ -38,6 +39,9 @@ public interface JetIndexKeys { StubIndexKey TOP_LEVEL_FUNCTIONS_FQN_NAME_KEY = StubIndexKey.createIndexKey("jet.top.level.functions.fqn.name"); + StubIndexKey TOP_LEVEL_PROPERTY_FQN_NAME_KEY = + StubIndexKey.createIndexKey("jet.top.level.property.fqn.name"); + StubIndexKey FUNCTIONS_SHORT_NAME_KEY = StubIndexKey.createIndexKey("jet.functions.short.name"); } diff --git a/idea/src/org/jetbrains/jet/plugin/stubindex/JetTopLevelPropertiesFqnNameIndex.java b/idea/src/org/jetbrains/jet/plugin/stubindex/JetTopLevelPropertiesFqnNameIndex.java new file mode 100644 index 00000000000..37082b38c83 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/stubindex/JetTopLevelPropertiesFqnNameIndex.java @@ -0,0 +1,48 @@ +/* + * Copyright 2010-2012 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.plugin.stubindex; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.stubs.StringStubIndexExtension; +import com.intellij.psi.stubs.StubIndexKey; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.psi.JetProperty; + +import java.util.Collection; + +/** + * @author Nikolay Krasko + */ +public class JetTopLevelPropertiesFqnNameIndex extends StringStubIndexExtension { + private static final JetTopLevelPropertiesFqnNameIndex INSTANCE = new JetTopLevelPropertiesFqnNameIndex(); + + public static JetTopLevelPropertiesFqnNameIndex getInstance() { + return INSTANCE; + } + + @NotNull + @Override + public StubIndexKey getKey() { + return JetIndexKeys.TOP_LEVEL_PROPERTY_FQN_NAME_KEY; + } + + @Override + public Collection get(final String s, final Project project, @NotNull final GlobalSearchScope scope) { + return super.get(s, project, new JetSourceFilterScope(scope)); + } +} diff --git a/idea/src/org/jetbrains/jet/plugin/stubindex/StubIndexServiceImpl.java b/idea/src/org/jetbrains/jet/plugin/stubindex/StubIndexServiceImpl.java index 2cda41679d7..7447d03f669 100644 --- a/idea/src/org/jetbrains/jet/plugin/stubindex/StubIndexServiceImpl.java +++ b/idea/src/org/jetbrains/jet/plugin/stubindex/StubIndexServiceImpl.java @@ -20,6 +20,7 @@ import com.intellij.psi.stubs.IndexSink; import org.jetbrains.jet.lang.psi.stubs.PsiJetClassStub; import org.jetbrains.jet.lang.psi.stubs.PsiJetFunctionStub; import org.jetbrains.jet.lang.psi.stubs.PsiJetObjectStub; +import org.jetbrains.jet.lang.psi.stubs.PsiJetPropertyStub; import org.jetbrains.jet.lang.psi.stubs.elements.StubIndexService; import org.jetbrains.jet.lang.resolve.name.FqName; @@ -76,4 +77,14 @@ public class StubIndexServiceImpl implements StubIndexService { sink.occurrence(JetIndexKeys.FUNCTIONS_SHORT_NAME_KEY, name); } } + + @Override + public void indexProperty(PsiJetPropertyStub stub, IndexSink sink) { + if (stub.isTopLevel()) { + FqName topFQName = stub.getTopFQName(); + if (topFQName != null) { + sink.occurrence(JetIndexKeys.TOP_LEVEL_PROPERTY_FQN_NAME_KEY, topFQName.toString()); + } + } + } } diff --git a/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/AbstractStubDeclarationProvider.java b/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/AbstractStubDeclarationProvider.java index 593726f45ab..28e619a28a9 100644 --- a/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/AbstractStubDeclarationProvider.java +++ b/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/AbstractStubDeclarationProvider.java @@ -19,12 +19,9 @@ package org.jetbrains.jet.plugin.stubindex.resolve; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.psi.JetClassOrObject; 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.resolve.lazy.DeclarationProvider; import org.jetbrains.jet.lang.resolve.name.Name; -import java.util.Collection; import java.util.List; /** @@ -37,20 +34,6 @@ public abstract class AbstractStubDeclarationProvider implements DeclarationProv return null; } - @NotNull - @Override - public Collection getFunctionDeclarations(@NotNull Name name) { - // TODO: - return null; - } - - @NotNull - @Override - public List getPropertyDeclarations(@NotNull Name name) { - // TODO: - return null; - } - @Override public JetClassOrObject getClassOrObjectDeclaration(@NotNull Name name) { // TODO: diff --git a/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubClassMemberDeclarationProvider.java b/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubClassMemberDeclarationProvider.java index d612e3dcd5e..b7134f1fe7f 100644 --- a/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubClassMemberDeclarationProvider.java +++ b/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubClassMemberDeclarationProvider.java @@ -17,8 +17,13 @@ package org.jetbrains.jet.plugin.stubindex.resolve; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.psi.JetNamedFunction; +import org.jetbrains.jet.lang.psi.JetProperty; import org.jetbrains.jet.lang.resolve.lazy.ClassMemberDeclarationProvider; import org.jetbrains.jet.lang.resolve.lazy.data.JetClassLikeInfo; +import org.jetbrains.jet.lang.resolve.name.Name; + +import java.util.Collection; /** * @author Nikolay Krasko @@ -30,4 +35,18 @@ public class StubClassMemberDeclarationProvider extends AbstractStubDeclarationP // TODO: return null; } + + @NotNull + @Override + public Collection getFunctionDeclarations(@NotNull Name name) { + // TODO: + return null; + } + + @NotNull + @Override + public Collection getPropertyDeclarations(@NotNull Name name) { + // TODO: + return null; + } } diff --git a/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubPackageMemberDeclarationProvider.java b/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubPackageMemberDeclarationProvider.java index d27ff25301c..9b3b8212745 100644 --- a/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubPackageMemberDeclarationProvider.java +++ b/idea/src/org/jetbrains/jet/plugin/stubindex/resolve/StubPackageMemberDeclarationProvider.java @@ -30,10 +30,10 @@ import org.jetbrains.jet.lang.resolve.lazy.PackageMemberDeclarationProvider; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.plugin.stubindex.JetTopLevelFunctionsFqnNameIndex; +import org.jetbrains.jet.plugin.stubindex.JetTopLevelPropertiesFqnNameIndex; import java.util.Collection; import java.util.HashSet; -import java.util.List; /** * @author Nikolay Krasko @@ -68,8 +68,8 @@ public class StubPackageMemberDeclarationProvider extends AbstractStubDeclaratio @NotNull @Override - public List getPropertyDeclarations(@NotNull Name name) { - return super.getPropertyDeclarations(name); //To change body of overridden methods use File | Settings | File Templates. + public Collection getPropertyDeclarations(@NotNull Name name) { + return JetTopLevelPropertiesFqnNameIndex.getInstance().get(fqName.child(name).toString(), project, GlobalSearchScope.allScope(project)); } @Override diff --git a/idea/tests/org/jetbrains/jet/plugin/stubs/JetStubsTest.java b/idea/tests/org/jetbrains/jet/plugin/stubs/JetStubsTest.java index 81257ec7379..bff6f96639a 100644 --- a/idea/tests/org/jetbrains/jet/plugin/stubs/JetStubsTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/stubs/JetStubsTest.java @@ -91,6 +91,23 @@ public class JetStubsTest extends LightCodeInsightFixtureTestCase { " VALUE_PARAMETER_LIST:PsiJetParameterListStubImpl\n"); } + public void testPackageProperty() { + doBuildTest("package test.testing\n" + + "val some = 12", + "PsiJetFileStubImpl[package=test.testing]\n" + + " PROPERTY:PsiJetPropertyStubImpl[val top topFQName=test.testing.some name=some typeText=null bodyText=12]\n"); + } + + public void testClassProperty() { + doBuildTest("class More { \n" + + " private val test : Int = 11\n" + + "}", + "PsiJetFileStubImpl[package=]\n" + + " CLASS:PsiJetClassStubImpl[name=More fqn=More superNames=[]]\n" + + " TYPE_PARAMETER_LIST:PsiJetTypeParameterListStubImpl\n" + + " PROPERTY:PsiJetPropertyStubImpl[val name=test typeText=Int bodyText=11]\n"); + } + public void testNotStorePropertyFromInitializer() { doBuildTest("fun DoubleArray.some() = for (element in this) println(element)", "PsiJetFileStubImpl[package=]\n" + diff --git a/idea/tests/org/jetbrains/jet/plugin/stubs/resolve/JetStubResolveTest.java b/idea/tests/org/jetbrains/jet/plugin/stubs/resolve/JetStubResolveTest.java index dd7c0508612..c270653cd47 100644 --- a/idea/tests/org/jetbrains/jet/plugin/stubs/resolve/JetStubResolveTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/stubs/resolve/JetStubResolveTest.java @@ -21,6 +21,7 @@ import com.google.common.collect.Collections2; import com.google.common.collect.Lists; import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; import org.jetbrains.jet.lang.psi.JetNamedFunction; +import org.jetbrains.jet.lang.psi.JetProperty; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.plugin.JetFileType; @@ -67,4 +68,18 @@ public class JetStubResolveTest extends LightCodeInsightFixtureTestCase { assertTrue(functionTexts.contains("fun other(v : Int) = 12")); assertTrue(functionTexts.contains("fun other(v : String) {}")); } + + public void testPackageProperty() { + myFixture.configureByText(JetFileType.INSTANCE, + "package test.testing\n" + + "val test = 12\n"); + + StubPackageMemberDeclarationProvider provider = + new StubPackageMemberDeclarationProvider(new FqName("test.testing"), getProject()); + + List testProperties = Lists.newArrayList(provider.getPropertyDeclarations(Name.identifier("test"))); + + assertSize(1, testProperties); + assertEquals("val test = 12", testProperties.get(0).getText()); + } }