From a770088c4ae4cb1668e7e71c1bbcd82fecd0c4ea Mon Sep 17 00:00:00 2001 From: Maxim Shafirov Date: Fri, 13 Feb 2009 22:02:36 +0300 Subject: [PATCH] Remove unnecessary layer in hierarchy. --- .../fileTypes/PlainTextParserDefinition.java | 4 +- .../intellij/psi/impl/source/tree/LeafElement.java | 65 ++++++++++++++++++---- .../psi/impl/source/tree/LeafPsiElement.java | 2 +- .../impl/source/tree/OwnBufferLeafPsiElement.java | 2 +- .../psi/impl/source/tree/JavaDocElementType.java | 6 +- .../psi/impl/source/tree/JavaElementType.java | 10 ++-- 6 files changed, 67 insertions(+), 22 deletions(-) diff --git a/lang-impl/src/com/intellij/openapi/fileTypes/PlainTextParserDefinition.java b/lang-impl/src/com/intellij/openapi/fileTypes/PlainTextParserDefinition.java index 4b03f9f63f..62b0e3fbd1 100644 --- a/lang-impl/src/com/intellij/openapi/fileTypes/PlainTextParserDefinition.java +++ b/lang-impl/src/com/intellij/openapi/fileTypes/PlainTextParserDefinition.java @@ -15,7 +15,7 @@ import com.intellij.psi.PlainTextTokenTypes; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.source.PsiPlainTextFileImpl; -import com.intellij.psi.impl.source.tree.CharTableBasedLeafElementImpl; +import com.intellij.psi.impl.source.tree.LeafElement; import com.intellij.psi.tree.IFileElementType; import com.intellij.psi.tree.TokenSet; import com.intellij.psi.util.PsiUtilBase; @@ -24,7 +24,7 @@ import org.jetbrains.annotations.NotNull; public class PlainTextParserDefinition implements ParserDefinition { private static final IFileElementType PLAIN_FILE_ELEMENT_TYPE = new IFileElementType(FileTypes.PLAIN_TEXT.getLanguage()) { public ASTNode parseContents(ASTNode chameleon) { - final CharSequence chars = ((CharTableBasedLeafElementImpl)chameleon).getInternedText(); + final CharSequence chars = ((LeafElement)chameleon).getInternedText(); return ASTFactory.leaf(PlainTextTokenTypes.PLAIN_TEXT, chars); } }; diff --git a/lang-impl/src/com/intellij/psi/impl/source/tree/LeafElement.java b/lang-impl/src/com/intellij/psi/impl/source/tree/LeafElement.java index ee4d72dee0..a4e3d3b4a4 100644 --- a/lang-impl/src/com/intellij/psi/impl/source/tree/LeafElement.java +++ b/lang-impl/src/com/intellij/psi/impl/source/tree/LeafElement.java @@ -5,30 +5,77 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.text.CharArrayUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public abstract class LeafElement extends TreeElement { private static final int TEXT_MATCHES_THRESHOLD = 5; - public abstract char charAt(int position); + private volatile CharSequence myText; - public abstract int copyTo(char[] buffer, int start); - - protected LeafElement(IElementType type) { + protected LeafElement(IElementType type, CharSequence text) { super(type); + myText = text; } - public LeafElement findLeafElementAt(int offset) { - return this; + public int getTextLength() { + return myText.length(); + } + + public CharSequence getInternedText() { + return myText; } public String getText() { return getInternedText().toString(); } - public abstract void setText(String text); - public abstract int textMatches(CharSequence buffer, int start); + public char charAt(int position) { + return myText.charAt(position); + } + + public int copyTo(char[] buffer, int start) { + if (buffer != null) { + CharArrayUtil.getChars(myText, buffer, start); + } + return start + myText.length(); + } + + @NotNull + public char[] textToCharArray() { + final char[] buffer = new char[myText.length()]; + CharArrayUtil.getChars(myText, buffer, 0); + return buffer; + } + + public boolean textContains(char c) { + CharSequence text = myText; + for (int i = 0; i < text.length(); i++) { + if (c == text.charAt(i)) return true; + } + + return false; + } + + public int textMatches(CharSequence buffer, int start) { + final CharSequence entry = myText; + final int length = entry.length(); + if(buffer.length() - start < length) return -1; + for(int i = 0; i < length; i++){ + if(entry.charAt(i) != buffer.charAt(i + start)) return -1; + } + return start + length; + } + + public void setText(String text) { + myText = SharedImplUtil.findCharTableByTree(this).intern(text); + clearCaches(); + } + + public LeafElement findLeafElementAt(int offset) { + return this; + } @SuppressWarnings({"MethodOverloadsMethodOfSuperclass"}) public boolean textMatches(final CharSequence buf, int start, int end) { @@ -53,8 +100,6 @@ public abstract class LeafElement extends TreeElement { visitor.visitLeaf(this); } - public abstract CharSequence getInternedText(); - public ASTNode findChildByType(IElementType type) { return null; } diff --git a/lang-impl/src/com/intellij/psi/impl/source/tree/LeafPsiElement.java b/lang-impl/src/com/intellij/psi/impl/source/tree/LeafPsiElement.java index 32d21049d5..700098469a 100644 --- a/lang-impl/src/com/intellij/psi/impl/source/tree/LeafPsiElement.java +++ b/lang-impl/src/com/intellij/psi/impl/source/tree/LeafPsiElement.java @@ -22,7 +22,7 @@ import com.intellij.util.CharTable; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; -public class LeafPsiElement extends CharTableBasedLeafElementImpl implements PsiElement, NavigationItem { +public class LeafPsiElement extends LeafElement implements PsiElement, NavigationItem { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.LeafPsiElement"); public LeafPsiElement(IElementType type, CharSequence text) { diff --git a/lang-impl/src/com/intellij/psi/impl/source/tree/OwnBufferLeafPsiElement.java b/lang-impl/src/com/intellij/psi/impl/source/tree/OwnBufferLeafPsiElement.java index 8e4769f7cf..ad14a340b2 100644 --- a/lang-impl/src/com/intellij/psi/impl/source/tree/OwnBufferLeafPsiElement.java +++ b/lang-impl/src/com/intellij/psi/impl/source/tree/OwnBufferLeafPsiElement.java @@ -15,7 +15,7 @@ import com.intellij.psi.tree.IElementType; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; -public class OwnBufferLeafPsiElement extends CharTableBasedLeafElementImpl implements PsiElement { +public class OwnBufferLeafPsiElement extends LeafElement implements PsiElement { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.tree.LeafPsiElement"); public OwnBufferLeafPsiElement(IElementType type, CharSequence text) { diff --git a/source/com/intellij/psi/impl/source/tree/JavaDocElementType.java b/source/com/intellij/psi/impl/source/tree/JavaDocElementType.java index 0569698f59..c532c62ebb 100644 --- a/source/com/intellij/psi/impl/source/tree/JavaDocElementType.java +++ b/source/com/intellij/psi/impl/source/tree/JavaDocElementType.java @@ -22,7 +22,7 @@ public interface JavaDocElementType { IElementType DOC_REFERENCE_HOLDER = new IChameleonElementType("DOC_REFERENCE_HOLDER", StdLanguages.JAVA){ public ASTNode parseContents(ASTNode chameleon) { - final CharSequence chars = ((CharTableBasedLeafElementImpl)chameleon).getInternedText(); + final CharSequence chars = ((LeafElement)chameleon).getInternedText(); final PsiManager manager = chameleon.getTreeParent().getPsi().getManager(); final CharTable table = SharedImplUtil.findCharTableByTree(chameleon); //no language features from higher java language versions are present in javadoc @@ -34,7 +34,7 @@ public interface JavaDocElementType { IElementType DOC_TYPE_HOLDER = new IChameleonElementType("DOC_TYPE_HOLDER", StdLanguages.JAVA){ public ASTNode parseContents(ASTNode chameleon) { - final CharSequence chars = ((CharTableBasedLeafElementImpl)chameleon).getInternedText(); + final CharSequence chars = ((LeafElement)chameleon).getInternedText(); final PsiManager manager = chameleon.getTreeParent().getPsi().getManager(); final CharTable table = SharedImplUtil.findCharTableByTree(chameleon); //no language features from higher java language versions are present in javadoc @@ -46,7 +46,7 @@ public interface JavaDocElementType { IElementType DOC_COMMENT = new IChameleonElementType("DOC_COMMENT", StdLanguages.JAVA){ public ASTNode parseContents(ASTNode chameleon) { - final CharSequence chars = ((CharTableBasedLeafElementImpl)chameleon).getInternedText(); + final CharSequence chars = ((LeafElement)chameleon).getInternedText(); final PsiManager manager = chameleon.getTreeParent().getPsi().getManager(); //no higher java language level features are allowed in javadoc final JavaParsingContext context = new JavaParsingContext(SharedImplUtil.findCharTableByTree(chameleon), LanguageLevel.JDK_1_3); diff --git a/source/com/intellij/psi/impl/source/tree/JavaElementType.java b/source/com/intellij/psi/impl/source/tree/JavaElementType.java index 87076a4dd3..6e0e2dfc65 100644 --- a/source/com/intellij/psi/impl/source/tree/JavaElementType.java +++ b/source/com/intellij/psi/impl/source/tree/JavaElementType.java @@ -138,7 +138,7 @@ public interface JavaElementType { IElementType EXPRESSION_STATEMENT = new IChameleonElementType("EXPRESSION_STATEMENT", StdLanguages.JAVA){ public ASTNode parseContents(ASTNode chameleon) { - final CharSequence chars = ((CharTableBasedLeafElementImpl)chameleon).getInternedText(); + final CharSequence chars = ((LeafElement)chameleon).getInternedText(); final PsiManager manager = chameleon.getTreeParent().getPsi().getManager(); final LanguageLevel languageLevel = PsiUtil.getLanguageLevel(TreeUtil.getFileElement((LeafElement)chameleon).getPsi()); final JavaParsingContext context = new JavaParsingContext(SharedImplUtil.findCharTableByTree(chameleon), languageLevel); @@ -150,7 +150,7 @@ public interface JavaElementType { //The following are the children of code fragment IElementType STATEMENTS = new ICodeFragmentElementType("STATEMENTS", StdLanguages.JAVA){ public ASTNode parseContents(ASTNode chameleon) { - final CharSequence chars = ((CharTableBasedLeafElementImpl)chameleon).getInternedText(); + final CharSequence chars = ((LeafElement)chameleon).getInternedText(); final PsiManager manager = chameleon.getTreeParent().getPsi().getManager(); final CharTable table = SharedImplUtil.findCharTableByTree(chameleon); final LanguageLevel languageLevel = PsiUtil.getLanguageLevel(TreeUtil.getFileElement((LeafElement)chameleon).getPsi()); @@ -163,7 +163,7 @@ public interface JavaElementType { IElementType EXPRESSION_TEXT = new ICodeFragmentElementType("EXPRESSION_TEXT", StdLanguages.JAVA){ public ASTNode parseContents(ASTNode chameleon) { - final CharSequence chars = ((CharTableBasedLeafElementImpl)chameleon).getInternedText(); + final CharSequence chars = ((LeafElement)chameleon).getInternedText(); final PsiManager manager = chameleon.getTreeParent().getPsi().getManager(); final LanguageLevel languageLevel = PsiUtil.getLanguageLevel(TreeUtil.getFileElement((LeafElement)chameleon).getPsi()); final JavaParsingContext context = new JavaParsingContext(SharedImplUtil.findCharTableByTree(chameleon), languageLevel); @@ -174,7 +174,7 @@ public interface JavaElementType { IElementType REFERENCE_TEXT = new ICodeFragmentElementType("REFERENCE_TEXT", StdLanguages.JAVA){ public ASTNode parseContents(ASTNode chameleon) { - final CharSequence chars = ((CharTableBasedLeafElementImpl)chameleon).getInternedText(); + final CharSequence chars = ((LeafElement)chameleon).getInternedText(); return Parsing.parseJavaCodeReferenceText(chameleon.getTreeParent().getPsi().getManager(), chars, 0, chars.length(), SharedImplUtil.findCharTableByTree(chameleon), true); } public boolean isParsable(CharSequence buffer, final Project project) {return false;} @@ -182,7 +182,7 @@ public interface JavaElementType { IElementType TYPE_TEXT = new ICodeFragmentElementType("TYPE_TEXT", StdLanguages.JAVA){ public ASTNode parseContents(ASTNode chameleon) { - final CharSequence chars = ((CharTableBasedLeafElementImpl)chameleon).getInternedText(); + final CharSequence chars = ((LeafElement)chameleon).getInternedText(); return Parsing.parseTypeText(chameleon.getTreeParent().getPsi().getManager(), null, chars, 0, chars.length(), 0, SharedImplUtil.findCharTableByTree(chameleon)); } public boolean isParsable(CharSequence buffer, final Project project) {return false;} -- 2.11.4.GIT