Java 类com.intellij.psi.text.BlockSupport 实例源码
项目:intellij-ce-playground
文件:AbstractReparseTestCase.java
protected void doReparse(final String s, final int length) {
CommandProcessor.getInstance().executeCommand(getProject(), new Runnable() {
@Override
public void run() {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
BlockSupport blockSupport = ServiceManager.getService(myProject, BlockSupport.class);
try {
blockSupport.reparseRange(myDummyFile, myInsertOffset - length, myInsertOffset, s);
}
catch (IncorrectOperationException e) {
LOG.error(e);
}
}
});
}
}, "asd", null);
}
项目:intellij-ce-playground
文件:PsiBuilderTest.java
public void testMergeWhenEmptyElementAfterWhitespaceIsLastChild() throws Throwable {
myBuilder = createBuilder(" foo bar");
parseWhenEmptyElementAfterWhitespaceIsLastChild();
final ASTNode tree = myBuilder.getTreeBuilt();
new DummyHolder(getPsiManager(), (TreeElement)tree, null);
myBuilder = createBuilder(" bar", tree);
parseWhenEmptyElementAfterWhitespaceIsLastChild();
DebugUtil.startPsiModification(null);
try {
myBuilder.getTreeBuilt();
fail();
}
catch (BlockSupport.ReparsedSuccessfullyException e) {
e.getDiffLog().performActualPsiChange(tree.getPsi().getContainingFile());
}
finally {
DebugUtil.finishPsiModification();
}
assertEquals(" bar", tree.getText());
}
项目:intellij-ce-playground
文件:PomModelImpl.java
private void reparseFile(final PsiFile file, FileElement treeElement, CharSequence newText) {
PsiToDocumentSynchronizer synchronizer =((PsiDocumentManagerBase)PsiDocumentManager.getInstance(myProject)).getSynchronizer();
TextRange changedPsiRange = DocumentCommitProcessor.getChangedPsiRange(file, treeElement, newText);
if (changedPsiRange == null) return;
final DiffLog log = BlockSupport.getInstance(myProject).reparseRange(file, changedPsiRange, newText, new EmptyProgressIndicator(),
treeElement.getText());
synchronizer.setIgnorePsiEvents(true);
try {
CodeStyleManager.getInstance(file.getProject()).performActionWithFormatterDisabled(new Runnable() {
@Override
public void run() {
runTransaction(new PomTransactionBase(file, getModelAspect(TreeAspect.class)) {
@Nullable
@Override
public PomModelEvent runInner() throws IncorrectOperationException {
return new TreeAspectEvent(PomModelImpl.this, log.performActualPsiChange(file));
}
});
}
});
}
finally {
synchronizer.setIgnorePsiEvents(false);
}
}
项目:intellij-ce-playground
文件:PsiBuilderImpl.java
@NotNull
private ASTNode buildTree() {
final StartMarker rootMarker = prepareLightTree();
final boolean isTooDeep = myFile != null && BlockSupport.isTooDeep(myFile.getOriginalFile());
if (myOriginalTree != null && !isTooDeep) {
DiffLog diffLog = merge(myOriginalTree, rootMarker, myLastCommittedText);
throw new BlockSupport.ReparsedSuccessfullyException(diffLog);
}
final ASTNode rootNode = createRootAST(rootMarker);
bind(rootMarker, (CompositeElement)rootNode);
if (isTooDeep && !(rootNode instanceof FileElement)) {
final ASTNode childNode = rootNode.getFirstChildNode();
childNode.putUserData(BlockSupport.TREE_DEPTH_LIMIT_EXCEEDED, Boolean.TRUE);
}
return rootNode;
}
项目:tools-idea
文件:AbstractReparseTestCase.java
protected void doReparse(final String s, final int length) {
CommandProcessor.getInstance().executeCommand(getProject(), new Runnable() {
@Override
public void run() {
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
BlockSupport blockSupport = ServiceManager.getService(myProject, BlockSupport.class);
try {
blockSupport.reparseRange(myDummyFile, myInsertOffset - length, myInsertOffset, s);
}
catch (IncorrectOperationException e) {
LOG.error(e);
}
}
});
}
}, "asd", null);
}
项目:tools-idea
文件:PsiBuilderTest.java
public void testMergeWhenEmptyElementAfterWhitespaceIsLastChild() throws Throwable {
myBuilder = createBuilder(" foo bar");
parseWhenEmptyElementAfterWhitespaceIsLastChild();
final ASTNode tree = myBuilder.getTreeBuilt();
new DummyHolder(getPsiManager(), (TreeElement)tree, null);
myBuilder = createBuilder(" bar", tree);
parseWhenEmptyElementAfterWhitespaceIsLastChild();
try {
myBuilder.getTreeBuilt();
fail();
}
catch (BlockSupport.ReparsedSuccessfullyException e) {
e.getDiffLog().performActualPsiChange(tree.getPsi().getContainingFile());
}
assertEquals(" bar", tree.getText());
}
项目:tools-idea
文件:PsiBuilderImpl.java
private ASTNode buildTree() {
final StartMarker rootMarker = prepareLightTree();
final boolean isTooDeep = myFile != null && BlockSupport.isTooDeep(myFile.getOriginalFile());
if (myOriginalTree != null && !isTooDeep) {
DiffLog diffLog = merge(myOriginalTree, rootMarker);
throw new BlockSupport.ReparsedSuccessfullyException(diffLog);
}
final ASTNode rootNode = createRootAST(rootMarker);
bind(rootMarker, (CompositeElement)rootNode);
if (isTooDeep && !(rootNode instanceof FileElement)) {
final ASTNode childNode = rootNode.getFirstChildNode();
childNode.putUserData(BlockSupport.TREE_DEPTH_LIMIT_EXCEEDED, Boolean.TRUE);
}
return rootNode;
}
项目:consulo
文件:PomModelImpl.java
@Nullable
private Runnable reparseFile(@Nonnull final PsiFile file, @Nonnull FileElement treeElement, @Nonnull CharSequence newText) {
TextRange changedPsiRange = ChangedPsiRangeUtil.getChangedPsiRange(file, treeElement, newText);
if (changedPsiRange == null) return null;
Runnable reparseLeaf = tryReparseOneLeaf(treeElement, newText, changedPsiRange);
if (reparseLeaf != null) return reparseLeaf;
final DiffLog log = BlockSupport.getInstance(myProject).reparseRange(file, treeElement, changedPsiRange, newText, new EmptyProgressIndicator(),
treeElement.getText());
return () -> runTransaction(new PomTransactionBase(file, getModelAspect(TreeAspect.class)) {
@Override
public PomModelEvent runInner() throws IncorrectOperationException {
return new TreeAspectEvent(PomModelImpl.this, log.performActualPsiChange(file));
}
});
}
项目:consulo-java
文件:AbstractReparseTestCase.java
protected void doReparse(final String s, final int length)
{
CommandProcessor.getInstance().executeCommand(getProject(), new Runnable()
{
@Override
public void run()
{
ApplicationManager.getApplication().runWriteAction(new Runnable()
{
@Override
public void run()
{
BlockSupport blockSupport = ServiceManager.getService(myProject, BlockSupport.class);
try
{
blockSupport.reparseRange(myDummyFile, myInsertOffset - length, myInsertOffset, s);
}
catch(IncorrectOperationException e)
{
LOGGER.error(e);
}
}
});
}
}, "asd", null);
}
项目:intellij-ce-playground
文件:ExpressionUtil.java
@Nullable
public static String[] getNames(final ExpressionContext context) {
final Project project = context.getProject();
final int offset = context.getStartOffset();
PsiDocumentManager.getInstance(project).commitAllDocuments();
String[] names = null;
PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(context.getEditor().getDocument());
PsiElement element = file.findElementAt(offset);
if (element instanceof PsiIdentifier){
names = getNamesForIdentifier(project, (PsiIdentifier)element);
}
else{
final PsiFile fileCopy = (PsiFile)file.copy();
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
BlockSupport blockSupport = BlockSupport.getInstance(project);
try{
blockSupport.reparseRange(fileCopy, offset, offset, "xxx");
}
catch(IncorrectOperationException e){
LOG.error(e);
}
}
});
PsiElement identifierCopy = fileCopy.findElementAt(offset);
if (identifierCopy instanceof PsiIdentifier) {
names = getNamesForIdentifier(project, (PsiIdentifier)identifierCopy);
}
}
return names;
}
项目:intellij-ce-playground
文件:PsiBuilderImpl.java
public PsiBuilderImpl(@NotNull final Project project,
@NotNull final ParserDefinition parserDefinition,
@NotNull final Lexer lexer,
@NotNull final ASTNode chameleon,
@NotNull final CharSequence text) {
this(project, SharedImplUtil.getContainingFile(chameleon), parserDefinition.getWhitespaceTokens(), parserDefinition.getCommentTokens(),
lexer, SharedImplUtil.findCharTableByTree(chameleon), text,
Pair.getFirst(chameleon.getUserData(BlockSupport.TREE_TO_BE_REPARSED)), Pair.getSecond(chameleon.getUserData(BlockSupport.TREE_TO_BE_REPARSED)), null, null);
}
项目:intellij-ce-playground
文件:PsiBuilderImpl.java
private void checkTreeDepth(final int maxDepth, final boolean isFileRoot) {
if (myFile == null) return;
final PsiFile file = myFile.getOriginalFile();
final Boolean flag = file.getUserData(BlockSupport.TREE_DEPTH_LIMIT_EXCEEDED);
if (maxDepth > BlockSupport.INCREMENTAL_REPARSE_DEPTH_LIMIT) {
if (!Boolean.TRUE.equals(flag)) {
file.putUserData(BlockSupport.TREE_DEPTH_LIMIT_EXCEEDED, Boolean.TRUE);
}
}
else if (isFileRoot && flag != null) {
file.putUserData(BlockSupport.TREE_DEPTH_LIMIT_EXCEEDED, null);
}
}
项目:intellij-ce-playground
文件:DocumentCommitProcessor.java
private void assertAfterCommit(@NotNull Document document,
@NotNull final PsiFile file,
@NotNull FileElement myTreeElementBeingReparsedSoItWontBeCollected) {
if (myTreeElementBeingReparsedSoItWontBeCollected.getTextLength() != document.getTextLength()) {
final String documentText = document.getText();
String fileText = file.getText();
LOG.error("commitDocument left PSI inconsistent: " + file +
"; file len=" + myTreeElementBeingReparsedSoItWontBeCollected.getTextLength() +
"; doc len=" + document.getTextLength() +
"; doc.getText() == file.getText(): " + Comparing.equal(fileText, documentText),
new Attachment("file psi text", fileText),
new Attachment("old text", documentText));
file.putUserData(BlockSupport.DO_NOT_REPARSE_INCREMENTALLY, Boolean.TRUE);
try {
BlockSupport blockSupport = BlockSupport.getInstance(file.getProject());
final DiffLog diffLog = blockSupport.reparseRange(file, new TextRange(0, documentText.length()), documentText, createProgressIndicator(),
myTreeElementBeingReparsedSoItWontBeCollected.getText());
doActualPsiChange(file, diffLog);
if (myTreeElementBeingReparsedSoItWontBeCollected.getTextLength() != document.getTextLength()) {
LOG.error("PSI is broken beyond repair in: " + file);
}
}
finally {
file.putUserData(BlockSupport.DO_NOT_REPARSE_INCREMENTALLY, null);
}
}
}
项目:glsl4idea
文件:GLSLParser.java
@Override
@NotNull
public ASTNode parse(@NotNull IElementType root, @NotNull PsiBuilder builder) {
try {
parseLight(root, builder);
return builder.getTreeBuilt();
} catch (ProcessCanceledException | BlockSupport.ReparsedSuccessfullyException ignore) {
// Not a problem
throw ignore;
} catch (Exception ex) {
crashing = true;
Logger.getLogger("GLSLParser").log(Level.WARNING, "Crashed while trying to parse "+root, ex);
throw ex;
}
}
项目:tools-idea
文件:ExpressionUtil.java
@Nullable
public static String[] getNames(final ExpressionContext context) {
final Project project = context.getProject();
final int offset = context.getStartOffset();
PsiDocumentManager.getInstance(project).commitAllDocuments();
String[] names = null;
PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(context.getEditor().getDocument());
PsiElement element = file.findElementAt(offset);
if (element instanceof PsiIdentifier){
names = getNamesForIdentifier(project, (PsiIdentifier)element);
}
else{
final PsiFile fileCopy = (PsiFile)file.copy();
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
BlockSupport blockSupport = BlockSupport.getInstance(project);
try{
blockSupport.reparseRange(fileCopy, offset, offset, "xxx");
}
catch(IncorrectOperationException e){
LOG.error(e);
}
}
});
PsiElement identifierCopy = fileCopy.findElementAt(offset);
if (identifierCopy instanceof PsiIdentifier) {
names = getNamesForIdentifier(project, (PsiIdentifier)identifierCopy);
}
}
return names;
}
项目:tools-idea
文件:PomModelImpl.java
private void reparseFile(final PsiFile file, String newText, String oldText) {
if (oldText.equals(newText)) return;
PsiToDocumentSynchronizer synchronizer =((PsiDocumentManagerBase)PsiDocumentManager.getInstance(myProject)).getSynchronizer();
int changeStart = StringUtil.commonPrefixLength(oldText, newText);
int changeEnd = oldText.length() - StringUtil.commonSuffixLength(oldText, newText);
TextRange changedPsiRange = DocumentCommitProcessor.getChangedPsiRange(file, changeStart, changeEnd, newText.length());
final DiffLog log = BlockSupport.getInstance(myProject).reparseRange(file, changedPsiRange, newText, new EmptyProgressIndicator());
synchronizer.setIgnorePsiEvents(true);
try {
CodeStyleManager.getInstance(file.getProject()).performActionWithFormatterDisabled(new Runnable() {
@Override
public void run() {
runTransaction(new PomTransactionBase(file, getModelAspect(TreeAspect.class)) {
@Nullable
@Override
public PomModelEvent runInner() throws IncorrectOperationException {
return new TreeAspectEvent(PomModelImpl.this, log.performActualPsiChange(file));
}
});
}
});
}
finally {
synchronizer.setIgnorePsiEvents(false);
}
}
项目:tools-idea
文件:PsiBuilderImpl.java
public PsiBuilderImpl(@NotNull final Project project,
@NotNull final ParserDefinition parserDefinition,
@NotNull final Lexer lexer,
@NotNull final ASTNode chameleon,
@NotNull final CharSequence text) {
this(project, SharedImplUtil.getContainingFile(chameleon), parserDefinition, lexer, SharedImplUtil.findCharTableByTree(chameleon), text,
chameleon.getUserData(BlockSupport.TREE_TO_BE_REPARSED), null);
}
项目:tools-idea
文件:PsiBuilderImpl.java
private void checkTreeDepth(final int maxDepth, final boolean isFileRoot) {
if (myFile == null) return;
final PsiFile file = myFile.getOriginalFile();
final Boolean flag = file.getUserData(BlockSupport.TREE_DEPTH_LIMIT_EXCEEDED);
if (maxDepth > BlockSupport.INCREMENTAL_REPARSE_DEPTH_LIMIT) {
if (!Boolean.TRUE.equals(flag)) {
file.putUserData(BlockSupport.TREE_DEPTH_LIMIT_EXCEEDED, Boolean.TRUE);
}
}
else if (isFileRoot && flag != null) {
file.putUserData(BlockSupport.TREE_DEPTH_LIMIT_EXCEEDED, null);
}
}
项目:consulo
文件:PsiBuilderImpl.java
public PsiBuilderImpl(@Nonnull Project project,
@Nonnull ParserDefinition parserDefinition,
@Nonnull LanguageVersion languageVersion,
@Nonnull Lexer lexer,
@Nonnull ASTNode chameleon,
@Nonnull CharSequence text) {
this(project, SharedImplUtil.getContainingFile(chameleon), languageVersion, parserDefinition, lexer, SharedImplUtil.findCharTableByTree(chameleon), text,
Pair.getFirst(chameleon.getUserData(BlockSupport.TREE_TO_BE_REPARSED)), Pair.getSecond(chameleon.getUserData(BlockSupport.TREE_TO_BE_REPARSED)), null,
chameleon);
}
项目:consulo
文件:PsiBuilderImpl.java
private void checkTreeDepth(final int maxDepth, final boolean isFileRoot) {
if (myFile == null) return;
final PsiFile file = myFile.getOriginalFile();
final Boolean flag = file.getUserData(BlockSupport.TREE_DEPTH_LIMIT_EXCEEDED);
if (maxDepth > BlockSupport.INCREMENTAL_REPARSE_DEPTH_LIMIT) {
if (!Boolean.TRUE.equals(flag)) {
file.putUserData(BlockSupport.TREE_DEPTH_LIMIT_EXCEEDED, Boolean.TRUE);
}
}
else if (isFileRoot && flag != null) {
file.putUserData(BlockSupport.TREE_DEPTH_LIMIT_EXCEEDED, null);
}
}
项目:consulo
文件:DocumentCommitThread.java
private static void assertAfterCommit(@Nonnull Document document, @Nonnull final PsiFile file, @Nonnull FileElement oldFileNode) {
if (oldFileNode.getTextLength() != document.getTextLength()) {
final String documentText = document.getText();
String fileText = file.getText();
boolean sameText = Comparing.equal(fileText, documentText);
LOG.error("commitDocument() left PSI inconsistent: " +
DebugUtil.diagnosePsiDocumentInconsistency(file, document) +
"; node.length=" +
oldFileNode.getTextLength() +
"; doc.text" +
(sameText ? "==" : "!=") +
"file.text" +
"; file name:" +
file.getName() +
"; type:" +
file.getFileType() +
"; lang:" +
file.getLanguage());
file.putUserData(BlockSupport.DO_NOT_REPARSE_INCREMENTALLY, Boolean.TRUE);
try {
BlockSupport blockSupport = BlockSupport.getInstance(file.getProject());
final DiffLog diffLog = blockSupport.reparseRange(file, file.getNode(), new TextRange(0, documentText.length()), documentText, createProgressIndicator(), oldFileNode.getText());
diffLog.doActualPsiChange(file);
if (oldFileNode.getTextLength() != document.getTextLength()) {
LOG.error("PSI is broken beyond repair in: " + file);
}
}
finally {
file.putUserData(BlockSupport.DO_NOT_REPARSE_INCREMENTALLY, null);
}
}
}
项目:consulo-java
文件:ExpressionUtil.java
@Nullable
public static String[] getNames(final ExpressionContext context) {
final Project project = context.getProject();
final int offset = context.getStartOffset();
PsiDocumentManager.getInstance(project).commitAllDocuments();
String[] names = null;
PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(context.getEditor().getDocument());
PsiElement element = file.findElementAt(offset);
if (element instanceof PsiIdentifier){
names = getNamesForIdentifier(project, (PsiIdentifier)element);
}
else{
final PsiFile fileCopy = (PsiFile)file.copy();
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
BlockSupport blockSupport = BlockSupport.getInstance(project);
try{
blockSupport.reparseRange(fileCopy, offset, offset, "xxx");
}
catch(IncorrectOperationException e){
LOG.error(e);
}
}
});
PsiElement identifierCopy = fileCopy.findElementAt(offset);
if (identifierCopy instanceof PsiIdentifier) {
names = getNamesForIdentifier(project, (PsiIdentifier)identifierCopy);
}
}
return names;
}
项目:tools-idea
文件:DocumentCommitProcessor.java
private void assertAfterCommit(Document document,
final PsiFile file,
String oldPsiText,
FileElement myTreeElementBeingReparsedSoItWontBeCollected) {
if (myTreeElementBeingReparsedSoItWontBeCollected.getTextLength() != document.getTextLength()) {
final String documentText = document.getText();
if (ApplicationManager.getApplication().isInternal()) {
String fileText = file.getText();
LOG.error("commitDocument left PSI inconsistent; file len=" + myTreeElementBeingReparsedSoItWontBeCollected.getTextLength() +
"; doc len=" + document.getTextLength() +
"; doc.getText() == file.getText(): " + Comparing.equal(fileText, documentText) +
";\n file psi text=" + fileText +
";\n doc text=" + documentText +
";\n old psi file text=" + oldPsiText);
}
else {
LOG.error("commitDocument left PSI inconsistent: " + file);
}
file.putUserData(BlockSupport.DO_NOT_REPARSE_INCREMENTALLY, Boolean.TRUE);
try {
BlockSupport blockSupport = BlockSupport.getInstance(file.getProject());
final DiffLog diffLog = blockSupport.reparseRange(file, new TextRange(0, documentText.length()), documentText, createProgressIndicator());
CodeStyleManager.getInstance(file.getProject()).performActionWithFormatterDisabled(new Runnable() {
@Override
public void run() {
synchronized (PsiLock.LOCK) {
doActualPsiChange(file, diffLog);
}
}
});
if (myTreeElementBeingReparsedSoItWontBeCollected.getTextLength() != document.getTextLength()) {
LOG.error("PSI is broken beyond repair in: " + file);
}
}
finally {
file.putUserData(BlockSupport.DO_NOT_REPARSE_INCREMENTALLY, null);
}
}
}
项目:consulo
文件:DocumentCommitThread.java
@Nonnull
private static BooleanRunnable doCommit(@Nonnull final CommitTask task,
@Nonnull final PsiFile file,
@Nonnull final FileASTNode oldFileNode,
@Nonnull ProperTextRange changedPsiRange,
@Nonnull List<BooleanRunnable> outReparseInjectedProcessors) {
Document document = task.getDocument();
final CharSequence newDocumentText = document.getImmutableCharSequence();
final Boolean data = document.getUserData(BlockSupport.DO_NOT_REPARSE_INCREMENTALLY);
if (data != null) {
document.putUserData(BlockSupport.DO_NOT_REPARSE_INCREMENTALLY, null);
file.putUserData(BlockSupport.DO_NOT_REPARSE_INCREMENTALLY, data);
}
Trinity<DiffLog, ASTNode, ASTNode> result = BlockSupportImpl.reparse(file, oldFileNode, changedPsiRange, newDocumentText, task.indicator, task.myLastCommittedText);
DiffLog diffLog = result.getFirst();
ASTNode oldRoot = result.getSecond();
ASTNode newRoot = result.getThird();
PsiDocumentManagerBase documentManager = (PsiDocumentManagerBase)PsiDocumentManager.getInstance(task.project);
List<BooleanRunnable> injectedRunnables = documentManager.reparseChangedInjectedFragments(document, file, changedPsiRange, task.indicator, oldRoot, newRoot);
outReparseInjectedProcessors.addAll(injectedRunnables);
return () -> {
FileViewProvider viewProvider = file.getViewProvider();
Document document1 = task.getDocument();
if (!task.isStillValid() || ((PsiDocumentManagerBase)PsiDocumentManager.getInstance(file.getProject())).getCachedViewProvider(document1) != viewProvider) {
return false; // optimistic locking failed
}
if (!ApplicationManager.getApplication().isWriteAccessAllowed()) {
VirtualFile vFile = viewProvider.getVirtualFile();
LOG.error("Write action expected" +
"; document=" +
document1 +
"; file=" +
file +
" of " +
file.getClass() +
"; file.valid=" +
file.isValid() +
"; file.eventSystemEnabled=" +
viewProvider.isEventSystemEnabled() +
"; viewProvider=" +
viewProvider +
" of " +
viewProvider.getClass() +
"; language=" +
file.getLanguage() +
"; vFile=" +
vFile +
" of " +
vFile.getClass() +
"; free-threaded=" +
AbstractFileViewProvider.isFreeThreaded(viewProvider));
}
diffLog.doActualPsiChange(file);
assertAfterCommit(document1, file, (FileElement)oldFileNode);
return true;
};
}