diff --git a/ExtendedApi/ExtendedApi.iml b/ExtendedApi/ExtendedApi.iml
new file mode 100644
index 000000000000..6e121a399bbd
--- /dev/null
+++ b/ExtendedApi/ExtendedApi.iml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/source/com/intellij/psi/impl/source/ASTWrapperPsiElement.java b/ExtendedApi/src/com/intellij/psi/impl/source/ASTWrapperPsiElement.java
similarity index 91%
rename from source/com/intellij/psi/impl/source/ASTWrapperPsiElement.java
rename to ExtendedApi/src/com/intellij/psi/impl/source/ASTWrapperPsiElement.java
index 55c37e02b13d..d498536b1405 100644
--- a/source/com/intellij/psi/impl/source/ASTWrapperPsiElement.java
+++ b/ExtendedApi/src/com/intellij/psi/impl/source/ASTWrapperPsiElement.java
@@ -14,11 +14,16 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.ElementBase;
import com.intellij.psi.impl.SharedPsiElementImplUtil;
+import com.intellij.psi.impl.source.resolve.ResolveUtil;
+import com.intellij.psi.impl.source.tree.CompositeElement;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.SearchScope;
import com.intellij.util.IncorrectOperationException;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* Created by IntelliJ IDEA.
* User: max
@@ -43,7 +48,15 @@ public class ASTWrapperPsiElement extends ElementBase implements PsiElement, Nav
}
public PsiElement[] getChildren() {
- return new PsiElement[0];
+ List result = new ArrayList();
+ ASTNode child = getNode().getFirstChildNode();
+ while (child != null) {
+ if (child instanceof CompositeElement) {
+ result.add(childNodeToPsi(child));
+ }
+ child = child.getTreeNext();
+ }
+ return result.toArray(new PsiElement[result.size()]);
}
public PsiElement getParent() {
@@ -209,7 +222,7 @@ public class ASTWrapperPsiElement extends ElementBase implements PsiElement, Nav
}
public PsiElement getContext() {
- throw new UnsupportedOperationException();
+ return ResolveUtil.getContext(this);
}
public boolean isPhysical() {
@@ -262,6 +275,10 @@ public class ASTWrapperPsiElement extends ElementBase implements PsiElement, Nav
return myNode;
}
+ public PsiElement childNodeToPsi(ASTNode node) {
+ return SourceTreeToPsiMap.treeElementToPsi(node);
+ }
+
public Language getLanguage() {
return myNode.getElementType().getLanguage();
}
diff --git a/source/com/intellij/testFramework/EditorActionTestCase.java b/ExtendedApi/src/com/intellij/testFramework/EditorActionTestCase.java
similarity index 100%
rename from source/com/intellij/testFramework/EditorActionTestCase.java
rename to ExtendedApi/src/com/intellij/testFramework/EditorActionTestCase.java
diff --git a/source/com/intellij/testFramework/IdeaTestCase.java b/ExtendedApi/src/com/intellij/testFramework/IdeaTestCase.java
similarity index 100%
rename from source/com/intellij/testFramework/IdeaTestCase.java
rename to ExtendedApi/src/com/intellij/testFramework/IdeaTestCase.java
diff --git a/source/com/intellij/testFramework/LightCodeInsightTestCase.java b/ExtendedApi/src/com/intellij/testFramework/LightCodeInsightTestCase.java
similarity index 100%
rename from source/com/intellij/testFramework/LightCodeInsightTestCase.java
rename to ExtendedApi/src/com/intellij/testFramework/LightCodeInsightTestCase.java
diff --git a/source/com/intellij/testFramework/LightIdeaTestCase.java b/ExtendedApi/src/com/intellij/testFramework/LightIdeaTestCase.java
similarity index 98%
rename from source/com/intellij/testFramework/LightIdeaTestCase.java
rename to ExtendedApi/src/com/intellij/testFramework/LightIdeaTestCase.java
index ae6b8f7c3049..519ddef77e87 100644
--- a/source/com/intellij/testFramework/LightIdeaTestCase.java
+++ b/ExtendedApi/src/com/intellij/testFramework/LightIdeaTestCase.java
@@ -26,7 +26,6 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.ex.dummy.DummyFileSystem;
import com.intellij.openapi.vfs.impl.VirtualFilePointerManagerImpl;
import com.intellij.openapi.vfs.pointers.VirtualFilePointerManager;
-import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.codeStyle.CodeStyleSettings;
@@ -57,10 +56,7 @@ public class LightIdeaTestCase extends TestCase implements DataProvider {
private static VirtualFile ourSourceRoot;
private static TestCase ourTestCase = null;
public static Thread ourTestThread;
-
- static {
- Logger.setFactory(TestLoggerFactory.getInstance());
- }
+ private String oldCodeStyleSettings;
/**
* @return Project to be used in tests for example for project components retrieval.
diff --git a/source/com/intellij/testFramework/LoggedErrorProcessor.java b/ExtendedApi/src/com/intellij/testFramework/LoggedErrorProcessor.java
similarity index 100%
rename from source/com/intellij/testFramework/LoggedErrorProcessor.java
rename to ExtendedApi/src/com/intellij/testFramework/LoggedErrorProcessor.java
diff --git a/source/com/intellij/testFramework/MockVirtualFile.java b/ExtendedApi/src/com/intellij/testFramework/MockVirtualFile.java
similarity index 100%
rename from source/com/intellij/testFramework/MockVirtualFile.java
rename to ExtendedApi/src/com/intellij/testFramework/MockVirtualFile.java
diff --git a/source/com/intellij/testFramework/ModuleTestCase.java b/ExtendedApi/src/com/intellij/testFramework/ModuleTestCase.java
similarity index 100%
rename from source/com/intellij/testFramework/ModuleTestCase.java
rename to ExtendedApi/src/com/intellij/testFramework/ModuleTestCase.java
diff --git a/testSource/com/intellij/psi/ParsingTestCase.java b/ExtendedApi/src/com/intellij/testFramework/ParsingTestCase.java
similarity index 81%
rename from testSource/com/intellij/psi/ParsingTestCase.java
rename to ExtendedApi/src/com/intellij/testFramework/ParsingTestCase.java
index f35f060c44cc..da66fc6d7c0b 100644
--- a/testSource/com/intellij/psi/ParsingTestCase.java
+++ b/ExtendedApi/src/com/intellij/testFramework/ParsingTestCase.java
@@ -1,11 +1,11 @@
-package com.intellij.psi;
+package com.intellij.testFramework;
import com.intellij.openapi.application.ex.PathManagerEx;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.psi.PsiFile;
import com.intellij.psi.impl.DebugUtil;
-import com.intellij.testFramework.LightIdeaTestCase;
import java.io.File;
import java.io.FileNotFoundException;
@@ -18,10 +18,14 @@ public abstract class ParsingTestCase extends LightIdeaTestCase {
public ParsingTestCase(String dataPath, String fileExt) {
myDataPath = dataPath;
- myFullDataPath = PathManagerEx.getTestDataPath() + "/psi/" + myDataPath;
+ myFullDataPath = testDataPath() + "/psi/" + myDataPath;
myFileExt = fileExt;
}
+ protected String testDataPath() {
+ return PathManagerEx.getTestDataPath();
+ }
+
protected void doTest(boolean checkResult) throws Exception{
String name = getTestName(false);
String text = loadFile(name + "." + myFileExt);
@@ -30,12 +34,12 @@ public abstract class ParsingTestCase extends LightIdeaTestCase {
checkResult(name + ".txt", file);
}
else{
- DebugUtil.treeToString(com.intellij.psi.impl.source.SourceTreeToPsiMap.psiElementToTree(file), false);
+ toParseTreeText(file);
}
}
protected void checkResult(String targetDataName, final PsiFile file) throws Exception {
- String treeText = DebugUtil.treeToString(com.intellij.psi.impl.source.SourceTreeToPsiMap.psiElementToTree(file), false).trim();
+ String treeText = toParseTreeText(file).trim();
try{
String expectedText = loadFile(targetDataName);
/*
@@ -63,6 +67,10 @@ public abstract class ParsingTestCase extends LightIdeaTestCase {
}
}
+ private String toParseTreeText(final PsiFile file) {
+ return DebugUtil.treeToString(com.intellij.psi.impl.source.SourceTreeToPsiMap.psiElementToTree(file), false);
+ }
+
protected String loadFile(String name) throws Exception {
String fullName = myFullDataPath + File.separatorChar + name;
String text = new String(FileUtil.loadFileText(new File(fullName))).trim();
diff --git a/source/com/intellij/testFramework/PsiTestCase.java b/ExtendedApi/src/com/intellij/testFramework/PsiTestCase.java
similarity index 100%
rename from source/com/intellij/testFramework/PsiTestCase.java
rename to ExtendedApi/src/com/intellij/testFramework/PsiTestCase.java
diff --git a/source/com/intellij/testFramework/PsiTestData.java b/ExtendedApi/src/com/intellij/testFramework/PsiTestData.java
similarity index 100%
rename from source/com/intellij/testFramework/PsiTestData.java
rename to ExtendedApi/src/com/intellij/testFramework/PsiTestData.java
diff --git a/source/com/intellij/testFramework/PsiTestUtil.java b/ExtendedApi/src/com/intellij/testFramework/PsiTestUtil.java
similarity index 100%
rename from source/com/intellij/testFramework/PsiTestUtil.java
rename to ExtendedApi/src/com/intellij/testFramework/PsiTestUtil.java
diff --git a/source/com/intellij/testFramework/TestEditorManagerImpl.java b/ExtendedApi/src/com/intellij/testFramework/TestEditorManagerImpl.java
similarity index 100%
rename from source/com/intellij/testFramework/TestEditorManagerImpl.java
rename to ExtendedApi/src/com/intellij/testFramework/TestEditorManagerImpl.java
diff --git a/source/com/intellij/testFramework/TestLogger.java b/ExtendedApi/src/com/intellij/testFramework/TestLogger.java
similarity index 100%
rename from source/com/intellij/testFramework/TestLogger.java
rename to ExtendedApi/src/com/intellij/testFramework/TestLogger.java
diff --git a/source/com/intellij/testFramework/TestLoggerFactory.java b/ExtendedApi/src/com/intellij/testFramework/TestLoggerFactory.java
similarity index 100%
rename from source/com/intellij/testFramework/TestLoggerFactory.java
rename to ExtendedApi/src/com/intellij/testFramework/TestLoggerFactory.java
diff --git a/source/com/intellij/testFramework/TestSourceBasedTestCase.java b/ExtendedApi/src/com/intellij/testFramework/TestSourceBasedTestCase.java
similarity index 100%
rename from source/com/intellij/testFramework/TestSourceBasedTestCase.java
rename to ExtendedApi/src/com/intellij/testFramework/TestSourceBasedTestCase.java
index 6ab7648c00a3..d5212ad91ce8 100644
--- a/source/com/intellij/testFramework/TestSourceBasedTestCase.java
+++ b/ExtendedApi/src/com/intellij/testFramework/TestSourceBasedTestCase.java
@@ -31,14 +31,14 @@
*/
package com.intellij.testFramework;
-import com.intellij.openapi.util.io.FileUtil;
-import com.intellij.openapi.application.ex.PathManagerEx;
import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.application.ex.PathManagerEx;
+import com.intellij.openapi.roots.ContentEntry;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.ModuleRootManager;
-import com.intellij.openapi.roots.ContentEntry;
-import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiManager;
diff --git a/openapi/src/com/intellij/lang/ASTNode.java b/openapi/src/com/intellij/lang/ASTNode.java
index 105131285cf8..752f908dce5c 100644
--- a/openapi/src/com/intellij/lang/ASTNode.java
+++ b/openapi/src/com/intellij/lang/ASTNode.java
@@ -1,10 +1,10 @@
package com.intellij.lang;
-import com.intellij.psi.tree.IElementType;
-import com.intellij.psi.tree.TokenSet;
+import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.UserDataHolder;
-import com.intellij.openapi.util.Key;
+import com.intellij.psi.tree.IElementType;
+import com.intellij.psi.tree.TokenSet;
/**
* Created by IntelliJ IDEA.
@@ -14,6 +14,8 @@ import com.intellij.openapi.util.Key;
* To change this template use File | Settings | File Templates.
*/
public interface ASTNode extends UserDataHolder {
+ ASTNode[] EMPTY_ARRAY = new ASTNode[0];
+
IElementType getElementType();
String getText();
@@ -59,4 +61,8 @@ public interface ASTNode extends UserDataHolder {
T getCopyableUserData(Key key);
void putCopyableUserData(Key key, T value);
+
+ ASTNode findChildByType(IElementType type);
+
+ ASTNode[] findChildrenByFilter(TokenSet filter);
}
diff --git a/openapi/src/com/intellij/lang/Language.java b/openapi/src/com/intellij/lang/Language.java
index c9c9d0a67adf..70f1cbc79f33 100644
--- a/openapi/src/com/intellij/lang/Language.java
+++ b/openapi/src/com/intellij/lang/Language.java
@@ -43,7 +43,7 @@ public abstract class Language {
return null;
}
- public ParserDefinition getParserDefinition(Project project) {
+ public ParserDefinition getParserDefinition() {
return null;
}
diff --git a/openapi/src/com/intellij/lang/PsiBuilder.java b/openapi/src/com/intellij/lang/PsiBuilder.java
index 3c6b1e042505..c25a0ae2ce07 100644
--- a/openapi/src/com/intellij/lang/PsiBuilder.java
+++ b/openapi/src/com/intellij/lang/PsiBuilder.java
@@ -1,7 +1,6 @@
package com.intellij.lang;
import com.intellij.psi.tree.IElementType;
-import com.intellij.psi.PsiElement;
/**
* Created by IntelliJ IDEA.
@@ -11,28 +10,20 @@ import com.intellij.psi.PsiElement;
* To change this template use File | Settings | File Templates.
*/
public interface PsiBuilder {
+ IElementType getTokenType();
+
interface Marker {
- }
-
- interface Lexem {
- IElementType getTokenType();
-
- String getTokenText();
+ Marker preceed();
+ void drop();
+ void rollbackTo();
+ void done(IElementType type);
}
void advanceLexer();
- Lexem getCurrentLexem();
+ Marker mark();
- Marker start(IElementType symbol);
-
- void rollbackTo(Marker marker);
-
- void drop(Marker marker);
-
- void done(Marker marker);
-
- void insertErrorElement(String messageText);
+ void error(String messageText);
boolean eof();
diff --git a/openapi/src/com/intellij/psi/tree/TokenSet.java b/openapi/src/com/intellij/psi/tree/TokenSet.java
index f5a4a2be82bc..de5b989f4f23 100644
--- a/openapi/src/com/intellij/psi/tree/TokenSet.java
+++ b/openapi/src/com/intellij/psi/tree/TokenSet.java
@@ -36,6 +36,7 @@ import gnu.trove.THashSet;
import java.util.Arrays;
public class TokenSet {
+ public static final TokenSet EMPTY = new TokenSet();
private final THashSet mySet = new THashSet(100, (float)0.1);
public IElementType[] getTypes() {
diff --git a/source/com/intellij/lang/dtd/DTDLanguage.java b/source/com/intellij/lang/dtd/DTDLanguage.java
index 2d08e064e786..fc81663d0c7b 100644
--- a/source/com/intellij/lang/dtd/DTDLanguage.java
+++ b/source/com/intellij/lang/dtd/DTDLanguage.java
@@ -23,7 +23,7 @@ public class DTDLanguage extends Language {
return new XmlFileHighlighter(true);
}
- public ParserDefinition getParserDefinition(Project project) {
+ public ParserDefinition getParserDefinition() {
return new DTDParserDefinition();
}
}
diff --git a/source/com/intellij/lang/html/HTMLLanguage.java b/source/com/intellij/lang/html/HTMLLanguage.java
index bb072a3e133e..c91f5efdddf6 100644
--- a/source/com/intellij/lang/html/HTMLLanguage.java
+++ b/source/com/intellij/lang/html/HTMLLanguage.java
@@ -33,7 +33,7 @@ public class HTMLLanguage extends XMLLanguage {
return ENCODE_EACH_SYMBOL_POLICY;
}
- public ParserDefinition getParserDefinition(Project project) {
+ public ParserDefinition getParserDefinition() {
return new HTMLParserDefinition();
}
}
diff --git a/source/com/intellij/lang/impl/PsiBuilderImpl.java b/source/com/intellij/lang/impl/PsiBuilderImpl.java
index 6677fd35d2c4..1b6a065cff0b 100644
--- a/source/com/intellij/lang/impl/PsiBuilderImpl.java
+++ b/source/com/intellij/lang/impl/PsiBuilderImpl.java
@@ -6,6 +6,7 @@ import com.intellij.lexer.Lexer;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.impl.source.tree.*;
import com.intellij.psi.tree.IElementType;
+import com.intellij.psi.tree.TokenSet;
import com.intellij.util.CharTable;
import java.util.ArrayList;
@@ -21,39 +22,65 @@ import java.util.List;
public class PsiBuilderImpl implements PsiBuilder {
private static final Logger LOG = Logger.getInstance("#com.intellij.lang.impl.PsiBuilderImpl");
- private List myLexems = new ArrayList();
- private List