From 98f0919c3df5b22e9a76d8dd41bf1b9c1a7744c2 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 15 Jun 2012 14:31:02 +0400 Subject: [PATCH] Stubs - Make JetClass use stub base element --- .../org/jetbrains/jet/lang/psi/JetClass.java | 20 +--- .../jet/lang/psi/JetStubDeclaration.java | 20 +++- .../jet/lang/psi/JetStubNamedDeclaration.java | 97 +++++++++++++++++++ .../psi/JetStubTypeParameterListOwner.java | 71 ++++++++++++++ .../stubs/elements/JetClassElementType.java | 3 +- 5 files changed, 192 insertions(+), 19 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/psi/JetStubNamedDeclaration.java create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/psi/JetStubTypeParameterListOwner.java 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 98b80a11907..014e784d444 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClass.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetClass.java @@ -20,7 +20,6 @@ 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; @@ -38,18 +37,16 @@ import java.util.List; /** * @author max */ -public class JetClass extends JetNotStubbedTypeParameterListOwner - implements JetClassOrObject, JetModifierListOwner, StubBasedPsiElement { - - private PsiJetClassStub stub; +public class JetClass extends JetStubTypeParameterListOwner + implements JetClassOrObject, JetModifierListOwner { public JetClass(@NotNull ASTNode node) { super(node); } - //public JetClass(@NotNull final PsiJetClassStub stub) { - // this.stub = stub; - //} + public JetClass(@NotNull final PsiJetClassStub stub) { + super(stub, JetStubElementTypes.CLASS); + } @Override public List getDeclarations() { @@ -154,16 +151,9 @@ public class JetClass extends JetNotStubbedTypeParameterListOwner @NotNull @Override public IStubElementType getElementType() { - // TODO (stubs) return JetStubElementTypes.CLASS; } - @Override - public PsiJetClassStub getStub() { - // TODO (stubs) - return null; - } - @Override public void delete() throws IncorrectOperationException { JetPsiUtil.deleteClass(this); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetStubDeclaration.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetStubDeclaration.java index d7895cc99d1..9ab6c132711 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetStubDeclaration.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetStubDeclaration.java @@ -19,6 +19,7 @@ package org.jetbrains.jet.lang.psi; import com.intellij.extapi.psi.StubBasedPsiElementBase; import com.intellij.lang.ASTNode; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.StubBasedPsiElement; import com.intellij.psi.stubs.IStubElementType; import com.intellij.psi.stubs.StubElement; @@ -49,6 +50,21 @@ abstract class JetStubDeclaration extends StubBasedPsiEle return modifierList != null && modifierList.hasModifier(modifier); } + @Override + public String toString() { + return getNode().getElementType().toString(); + } + + @Override + public final void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof JetVisitorVoid) { + accept((JetVisitorVoid) visitor); + } + else { + visitor.visitElement(this); + } + } + @Override public void acceptChildren(@NotNull JetTreeVisitor visitor, D data) { PsiElement child = getFirstChild(); @@ -62,11 +78,11 @@ abstract class JetStubDeclaration extends StubBasedPsiEle @Override public void accept(@NotNull JetVisitorVoid visitor) { - visitor.visitExpression(this); + visitor.visitJetElement(this); } @Override public R accept(@NotNull JetVisitor visitor, D data) { - return visitor.visitExpression(this, data); + return visitor.visitJetElement(this, data); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetStubNamedDeclaration.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetStubNamedDeclaration.java new file mode 100644 index 00000000000..0205643c025 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetStubNamedDeclaration.java @@ -0,0 +1,97 @@ +/* + * 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.lang.psi; + +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.stubs.IStubElementType; +import com.intellij.psi.stubs.StubElement; +import com.intellij.util.IncorrectOperationException; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.resolve.name.Name; +import org.jetbrains.jet.lexer.JetTokens; + +/** + * @author Nikolay Krasko + */ +abstract class JetStubNamedDeclaration extends JetStubDeclaration implements JetNamedDeclaration { + public JetStubNamedDeclaration(@NotNull T stub, @NotNull IStubElementType nodeType) { + super(stub, nodeType); + } + + public JetStubNamedDeclaration(@NotNull ASTNode node) { + super(node); + } + + @Override + public String getName() { + PsiElement identifier = getNameIdentifier(); + if (identifier != null) { + String text = identifier.getText(); + return text != null ? JetPsiUtil.unquoteIdentifier(text) : null; + } + else { + return null; + } + } + + @Override + public Name getNameAsName() { + String name = getName(); + return name != null ? Name.identifier(name) : null; + } + + @Override + @NotNull + public Name getNameAsSafeName() { + return JetPsiUtil.safeName(getName()); + } + + @Override + public PsiElement getNameIdentifier() { + return findChildByType(JetTokens.IDENTIFIER); + } + + @Override + public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException { + return getNameIdentifier().replace(JetPsiFactory.createNameIdentifier(getProject(), name)); + } + + @Override + public int getTextOffset() { + PsiElement identifier = getNameIdentifier(); + return identifier != null ? identifier.getTextRange().getStartOffset() : getTextRange().getStartOffset(); + } + + @Override + public boolean isScriptDeclaration() { + return getScript() != null; + } + + @Override + @Nullable + public JetScript getScript() { + if (getParent() != null && getParent().getParent() instanceof JetScript) { + return (JetScript) getParent().getParent(); + } + else { + return null; + } + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetStubTypeParameterListOwner.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetStubTypeParameterListOwner.java new file mode 100644 index 00000000000..c384ace349a --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetStubTypeParameterListOwner.java @@ -0,0 +1,71 @@ +/* + * 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.lang.psi; + +import com.intellij.lang.ASTNode; +import com.intellij.psi.stubs.IStubElementType; +import com.intellij.psi.stubs.StubElement; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.JetNodeTypes; + +import java.util.Collections; +import java.util.List; + +/** + * @author Nikolay Krasko + */ +abstract class JetStubTypeParameterListOwner extends JetStubNamedDeclaration implements JetTypeParameterListOwner { + public JetStubTypeParameterListOwner(@NotNull T stub, @NotNull IStubElementType nodeType) { + super(stub, nodeType); + } + + public JetStubTypeParameterListOwner(@NotNull ASTNode node) { + super(node); + } + + @Override + @Nullable + public JetTypeParameterList getTypeParameterList() { + return (JetTypeParameterList) findChildByType(JetNodeTypes.TYPE_PARAMETER_LIST); + } + + @Override + @Nullable + public JetTypeConstraintList getTypeConstraintList() { + return (JetTypeConstraintList) findChildByType(JetNodeTypes.TYPE_CONSTRAINT_LIST); + } + + @Override + @NotNull + public List getTypeConstraints() { + JetTypeConstraintList typeConstraintList = getTypeConstraintList(); + if (typeConstraintList == null) { + return Collections.emptyList(); + } + return typeConstraintList.getConstraints(); + } + + @Override + @NotNull + public List getTypeParameters() { + JetTypeParameterList list = getTypeParameterList(); + if (list == null) return Collections.emptyList(); + + return list.getParameters(); + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetClassElementType.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetClassElementType.java index 8d170a7c6b4..af946560ae0 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetClassElementType.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/stubs/elements/JetClassElementType.java @@ -51,8 +51,7 @@ public class JetClassElementType extends JetStubElementType