EA-61477 (assert: SharedImplUtil.findFileElement)
[idea/community.git] / platform / structuralsearch / source / com / intellij / structuralsearch / impl / matcher / MatchContext.java
1 package com.intellij.structuralsearch.impl.matcher;
2
3 import com.intellij.psi.PsiElement;
4 import com.intellij.structuralsearch.MatchOptions;
5 import com.intellij.structuralsearch.MatchResultSink;
6 import com.intellij.util.containers.Stack;
7
8 import java.util.Collection;
9 import java.util.List;
10
11 /**
12  * Global context of matching process
13  */
14 public class MatchContext {
15   private MatchResultSink sink;
16   private final Stack<MatchResultImpl> previousResults = new Stack<MatchResultImpl>();
17   private MatchResultImpl result;
18   private CompiledPattern pattern;
19   private MatchOptions options;
20   private GlobalMatchingVisitor matcher;
21   private boolean shouldRecursivelyMatch = true;
22   private boolean myWithAlternativePatternRoots = true;
23
24   private List<PsiElement> myMatchedNodes;
25
26   public List<PsiElement> getMatchedNodes() {
27     return myMatchedNodes;
28   }
29
30   public void setMatchedNodes(final List<PsiElement> matchedNodes) {
31     myMatchedNodes = matchedNodes;
32   }
33
34   public boolean isWithAlternativePatternRoots() {
35     return myWithAlternativePatternRoots;
36   }
37
38   public void setWithAlternativePatternRoots(boolean withAlternativePatternRoots) {
39     myWithAlternativePatternRoots = withAlternativePatternRoots;
40   }
41
42   public interface MatchedElementsListener {
43     void matchedElements(Collection<PsiElement> matchedElements);
44     void commitUnmatched();
45   }
46
47   private MatchedElementsListener myMatchedElementsListener;
48
49   public void setMatcher(GlobalMatchingVisitor matcher) {
50     this.matcher = matcher;
51   }
52
53   public GlobalMatchingVisitor getMatcher() {
54     return matcher;
55   }
56
57   public MatchOptions getOptions() {
58     return options;
59   }
60
61   public void setOptions(MatchOptions options) {
62     this.options = options;
63   }
64
65   public MatchResultImpl getPreviousResult() {
66     return previousResults.isEmpty() ? null : previousResults.peek();
67   }
68
69   public MatchResultImpl getResult() {
70     if (result==null) result = new MatchResultImpl();
71     return result;
72   }
73
74   public void pushResult() {
75     previousResults.push(result);
76     result = null;
77   }
78   
79   public void popResult() {
80     result = previousResults.pop();
81   }
82   
83   public void setResult(MatchResultImpl result) {
84     this.result = result;
85     if (result == null) {
86       pattern.clearHandlersState();
87     }
88   }
89
90   public boolean hasResult() {
91     return result!=null;
92   }
93
94   public CompiledPattern getPattern() {
95     return pattern;
96   }
97
98   public void setPattern(CompiledPattern pattern) {
99     this.pattern = pattern;
100   }
101
102   public MatchResultSink getSink() {
103     return sink;
104   }
105
106   public void setSink(MatchResultSink sink) {
107     this.sink = sink;
108   }
109
110   void clear() {
111     result = null;
112     pattern = null;
113   }
114
115   public boolean shouldRecursivelyMatch() {
116     return shouldRecursivelyMatch;
117   }
118
119   public void setShouldRecursivelyMatch(boolean shouldRecursivelyMatch) {
120     this.shouldRecursivelyMatch = shouldRecursivelyMatch;
121   }
122
123   public void setMatchedElementsListener(MatchedElementsListener _matchedElementsListener) {
124     myMatchedElementsListener = _matchedElementsListener;
125   }
126
127   public MatchedElementsListener getMatchedElementsListener() {
128     return myMatchedElementsListener;
129   }
130 }