From 070a3729e5c695febf235b609d8833c02fbef0b0 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 11 May 2012 19:19:52 +0400 Subject: [PATCH] Fixed unnecessary FQ name bug. #KT-1954 fixed --- .../org/jetbrains/jet/lang/psi/JetClass.java | 43 +++++++++++++++++-- .../jet/lang/psi/JetNamespaceHeader.java | 11 +++++ .../jetbrains/jet/parsing/JetParsingTest.java | 2 + 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClass.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClass.java index e126c6036a0..38186556f36 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClass.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClass.java @@ -17,8 +17,12 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; import com.intellij.psi.StubBasedPsiElement; import com.intellij.psi.stubs.IStubElementType; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -27,6 +31,7 @@ import org.jetbrains.jet.lang.psi.stubs.PsiJetClassStub; import org.jetbrains.jet.lang.psi.stubs.elements.JetStubElementTypes; import org.jetbrains.jet.lexer.JetTokens; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -41,11 +46,10 @@ public class JetClass extends JetTypeParameterListOwner public JetClass(@NotNull ASTNode node) { super(node); } - // TODO (stubs) -// public JetClass(final PsiJetClassStub stub) { -// this.stub = stub; -// } + // public JetClass(final PsiJetClassStub stub) { + // this.stub = stub; + // } @Override public List getDeclarations() { @@ -163,4 +167,35 @@ public class JetClass extends JetTypeParameterListOwner public void delete() throws IncorrectOperationException { JetPsiUtil.deleteClass(this); } + + @Override + public boolean isEquivalentTo(PsiElement another) { + if (super.isEquivalentTo(another)) { + return true; + } + if (another instanceof JetClass) { + String fq1 = getQualifiedName(); + String fq2 = ((JetClass) another).getQualifiedName(); + return fq1 != null && fq2 != null && fq1.equals(fq2); + } + return true; + } + + @Nullable + private String getQualifiedName() { + List parts = new ArrayList(); + JetClassOrObject current = this; + while (current != null) { + parts.add(current.getName()); + current = PsiTreeUtil.getParentOfType(current, JetClassOrObject.class); + } + PsiFile file = getContainingFile(); + if (!(file instanceof JetFile)) return null; + String fileQualifiedName = ((JetFile) file).getNamespaceHeader().getQualifiedName(); + if (!fileQualifiedName.isEmpty()) { + parts.add(fileQualifiedName); + } + Collections.reverse(parts); + return StringUtil.join(parts, "."); + } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamespaceHeader.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamespaceHeader.java index 8aa9295070f..ad4e4d725ea 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamespaceHeader.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetNamespaceHeader.java @@ -81,5 +81,16 @@ public class JetNamespaceHeader extends JetReferenceExpression { public boolean isRoot() { return getName().length() == 0; } + + public String getQualifiedName() { + StringBuilder builder = new StringBuilder(); + for (JetSimpleNameExpression e : findChildrenByClass(JetSimpleNameExpression.class)) { + if (builder.length() > 0) { + builder.append("."); + } + builder.append(e.getName()); + } + return builder.toString(); + } } diff --git a/compiler/tests/org/jetbrains/jet/parsing/JetParsingTest.java b/compiler/tests/org/jetbrains/jet/parsing/JetParsingTest.java index f4bad2d5e47..d5c169c97cf 100644 --- a/compiler/tests/org/jetbrains/jet/parsing/JetParsingTest.java +++ b/compiler/tests/org/jetbrains/jet/parsing/JetParsingTest.java @@ -38,6 +38,7 @@ import java.io.File; import java.io.IOException; import java.lang.annotation.Annotation; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; public class JetParsingTest extends ParsingTestCase { static { @@ -88,6 +89,7 @@ public class JetParsingTest extends ParsingTestCase { String methodName = method.getName(); if (!methodName.startsWith("get") && !methodName.startsWith("find") || methodName.equals("getReference") || methodName.equals("getReferences") || methodName.equals("getUseScope")) continue; + if (!Modifier.isPublic(method.getModifiers())) continue; if (method.getParameterTypes().length > 0) continue; Class declaringClass = method.getDeclaringClass(); if (!declaringClass.getName().startsWith("org.jetbrains.jet")) continue;