diff --git a/platform/core-api/src/com/intellij/psi/SyntaxTraverser.java b/platform/core-api/src/com/intellij/psi/SyntaxTraverser.java index cff07563ccaa..5631b311d636 100644 --- a/platform/core-api/src/com/intellij/psi/SyntaxTraverser.java +++ b/platform/core-api/src/com/intellij/psi/SyntaxTraverser.java @@ -70,7 +70,7 @@ public class SyntaxTraverser extends FilteredTraverserBase lightTraverser(@NotNull PsiBuilder builder) { LighterASTApi api = new LighterASTApi(builder); - return new SyntaxTraverser(api, Meta.empty().withRoots(JBIterable.of(api.flyweightStructure.getRoot()))); + return new SyntaxTraverser(api, Meta.empty().withRoots(JBIterable.of(api.getStructure().getRoot()))); } public final Api api; @@ -363,16 +363,14 @@ public class SyntaxTraverser extends FilteredTraverserBase extends Api { - final FlyweightCapableTreeStructure flyweightStructure; - public FlyweightApi(@NotNull FlyweightCapableTreeStructure structure) { - flyweightStructure = structure; - } + @NotNull + abstract FlyweightCapableTreeStructure getStructure(); @Nullable @Override public T parent(@NotNull T node) { - return flyweightStructure.getParent(node); + return getStructure().getParent(node); } @NotNull @@ -381,8 +379,9 @@ public class SyntaxTraverser extends FilteredTraverserBase() { @Override public Iterator iterator() { + FlyweightCapableTreeStructure structure = getStructure(); Ref ref = Ref.create(); - int count = flyweightStructure.getChildren(flyweightStructure.prepareForGetChildren(node), ref); + int count = structure.getChildren(structure.prepareForGetChildren(node), ref); if (count == 0) return ContainerUtil.emptyIterator(); T[] array = ref.get(); LinkedList list = ContainerUtil.newLinkedList(); @@ -399,7 +398,7 @@ public class SyntaxTraverser extends FilteredTraverserBase extends FilteredTraverserBase { private final PsiBuilder builder; + private final ThreadLocalCachedValue> structure = + new ThreadLocalCachedValue>() { + @Override + protected FlyweightCapableTreeStructure create() { + return builder.getLightTree(); + } + }; - public LighterASTApi(PsiBuilder builder) { - super(builder.getLightTree()); + public LighterASTApi(final PsiBuilder builder) { this.builder = builder; } + @NotNull + @Override + FlyweightCapableTreeStructure getStructure() { + return structure.getValue(); + } + @NotNull @Override public IElementType typeOf(@NotNull LighterASTNode node) {