From f05916c5f2e4b0fa40453eb6cf6263c3e102ae74 Mon Sep 17 00:00:00 2001 From: Mikhail Senkov Date: Tue, 24 Jul 2012 14:10:39 +0400 Subject: [PATCH] OC-4427 --- .../com/intellij/lang/ForeignLeafType.java | 2 +- .../intellij/lang/impl/PsiBuilderImpl.java | 14 ++++++------- .../source/tree/ForeignLeafPsiElement.java | 20 +++++++++++++++++-- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/platform/core-impl/src/com/intellij/lang/ForeignLeafType.java b/platform/core-impl/src/com/intellij/lang/ForeignLeafType.java index bc114917769d..f6e8f3065333 100644 --- a/platform/core-impl/src/com/intellij/lang/ForeignLeafType.java +++ b/platform/core-impl/src/com/intellij/lang/ForeignLeafType.java @@ -32,6 +32,6 @@ public class ForeignLeafType extends TokenWrapper implements ILeafElementType { @Override @NotNull public ASTNode createLeafNode(CharSequence leafText) { - return new ForeignLeafPsiElement(getDelegate(), getValue()); + return new ForeignLeafPsiElement(this, getValue()); } } diff --git a/platform/core-impl/src/com/intellij/lang/impl/PsiBuilderImpl.java b/platform/core-impl/src/com/intellij/lang/impl/PsiBuilderImpl.java index 15ce63211bce..9d6e1ef3f87a 100644 --- a/platform/core-impl/src/com/intellij/lang/impl/PsiBuilderImpl.java +++ b/platform/core-impl/src/com/intellij/lang/impl/PsiBuilderImpl.java @@ -1367,15 +1367,13 @@ public class PsiBuilderImpl extends UserDataHolderBase implements PsiBuilder, AS return ourAnyLanguageWhitespaceTokens.contains(n2.getTokenType()) || n2 instanceof Token && ((Token)n2).myBuilder.myWhitespaces.contains(n2.getTokenType()); } + IElementType n1t; + if (n1 instanceof ForeignLeafPsiElement) + n1t = ((ForeignLeafPsiElement)n1).getForeignType(); + else + n1t = n1.getElementType(); - return dereferenceToken(n1.getElementType()) == dereferenceToken(n2.getTokenType()); - } - - public static IElementType dereferenceToken(IElementType probablyWrapper) { - if (probablyWrapper instanceof TokenWrapper) { - return dereferenceToken(((TokenWrapper)probablyWrapper).getDelegate()); - } - return probablyWrapper; + return Comparing.equal(n1t, n2.getTokenType()); } @Override diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/tree/ForeignLeafPsiElement.java b/platform/core-impl/src/com/intellij/psi/impl/source/tree/ForeignLeafPsiElement.java index 3e893cc10276..71e25c4cb1f0 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/tree/ForeignLeafPsiElement.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/tree/ForeignLeafPsiElement.java @@ -19,13 +19,25 @@ */ package com.intellij.psi.impl.source.tree; +import com.intellij.lang.ForeignLeafType; +import com.intellij.lang.TokenWrapper; import com.intellij.psi.PsiElement; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; public class ForeignLeafPsiElement extends LeafPsiElement { - public ForeignLeafPsiElement(IElementType type, CharSequence text) { - super(type, text); + private ForeignLeafType myForeignType; + + public ForeignLeafPsiElement(ForeignLeafType type, CharSequence text) { + super(dereferenceElementType(type.getDelegate()), text); + myForeignType = type; + } + + private static IElementType dereferenceElementType(IElementType type) { + while ( type instanceof TokenWrapper) + type = (( TokenWrapper ) type ).getDelegate(); + + return type; } @Override @@ -63,6 +75,10 @@ public class ForeignLeafPsiElement extends LeafPsiElement { return 0; } + public ForeignLeafType getForeignType() { + return myForeignType; + } + @Override public String toString() { return "ForeignLeaf(" + getElementType() + ": " + getText() + ")";