Lines 50-56
Link Here
|
50 |
import java.util.Map; |
50 |
import java.util.Map; |
51 |
import java.util.Map.Entry; |
51 |
import java.util.Map.Entry; |
52 |
import java.util.Set; |
52 |
import java.util.Set; |
53 |
import java.util.concurrent.atomic.AtomicBoolean; |
|
|
54 |
import java.util.logging.Level; |
53 |
import java.util.logging.Level; |
55 |
import java.util.logging.Logger; |
54 |
import java.util.logging.Logger; |
56 |
import javax.swing.text.BadLocationException; |
55 |
import javax.swing.text.BadLocationException; |
Lines 68-73
Link Here
|
68 |
import org.netbeans.modules.csl.core.GsfHtmlFormatter; |
67 |
import org.netbeans.modules.csl.core.GsfHtmlFormatter; |
69 |
import org.netbeans.modules.csl.core.Language; |
68 |
import org.netbeans.modules.csl.core.Language; |
70 |
import org.netbeans.modules.csl.core.LanguageRegistry; |
69 |
import org.netbeans.modules.csl.core.LanguageRegistry; |
|
|
70 |
import org.netbeans.modules.csl.core.SpiSupportAccessor; |
71 |
import org.netbeans.modules.csl.navigation.ElementScanningTask; |
71 |
import org.netbeans.modules.csl.navigation.ElementScanningTask; |
72 |
import org.netbeans.modules.csl.spi.ParserResult; |
72 |
import org.netbeans.modules.csl.spi.ParserResult; |
73 |
import org.netbeans.modules.parsing.api.Embedding; |
73 |
import org.netbeans.modules.parsing.api.Embedding; |
Lines 82-88
Link Here
|
82 |
import org.netbeans.modules.parsing.spi.Scheduler; |
82 |
import org.netbeans.modules.parsing.spi.Scheduler; |
83 |
import org.netbeans.modules.parsing.spi.SchedulerEvent; |
83 |
import org.netbeans.modules.parsing.spi.SchedulerEvent; |
84 |
import org.netbeans.modules.parsing.spi.SchedulerTask; |
84 |
import org.netbeans.modules.parsing.spi.SchedulerTask; |
85 |
import org.netbeans.modules.parsing.spi.TaskFactory; |
85 |
import org.netbeans.modules.parsing.spi.support.CancelSupport; |
86 |
import org.openide.filesystems.FileObject; |
86 |
import org.openide.filesystems.FileObject; |
87 |
import org.openide.text.NbDocument; |
87 |
import org.openide.text.NbDocument; |
88 |
import org.openide.util.NbBundle; |
88 |
import org.openide.util.NbBundle; |
Lines 91-200
Link Here
|
91 |
* |
91 |
* |
92 |
* @author lahvac |
92 |
* @author lahvac |
93 |
*/ |
93 |
*/ |
94 |
public class ComputeAnnotations extends ParserResultTask<Result> { |
94 |
public final class ComputeAnnotations extends ParserResultTask<Result> { |
95 |
|
95 |
|
96 |
private static final Logger LOG = Logger.getLogger(ComputeAnnotations.class.getName()); |
96 |
private static final Logger LOG = Logger.getLogger(ComputeAnnotations.class.getName()); |
97 |
private final AtomicBoolean cancel = new AtomicBoolean(); |
97 |
private final CancelSupport cancel = CancelSupport.create(this); |
98 |
|
98 |
|
99 |
@Override |
99 |
@Override |
100 |
public void run(Result result, SchedulerEvent event) { |
100 |
public void run(Result result, SchedulerEvent event) { |
101 |
if (!(result instanceof ParserResult)) { |
101 |
if (!(result instanceof ParserResult)) { |
102 |
return; |
102 |
return; |
103 |
} |
103 |
} |
|
|
104 |
SpiSupportAccessor.getInstance().setCancelSupport(cancel); |
105 |
try { |
106 |
final FileObject file = result.getSnapshot().getSource().getFileObject(); |
104 |
|
107 |
|
105 |
cancel.set(false); |
108 |
if (file == null) { |
106 |
|
109 |
return; |
107 |
final FileObject file = result.getSnapshot().getSource().getFileObject(); |
110 |
} |
108 |
|
111 |
|
109 |
if (file == null) { |
112 |
final StyledDocument doc = (StyledDocument) result.getSnapshot().getSource().getDocument(false); |
110 |
return; |
|
|
111 |
} |
112 |
|
113 |
|
113 |
final StyledDocument doc = (StyledDocument) result.getSnapshot().getSource().getDocument(false); |
114 |
if (doc == null) { |
|
|
115 |
return; |
116 |
} |
114 |
|
117 |
|
115 |
if (doc == null) { |
118 |
final List<IsOverriddenAnnotation> annotations = new LinkedList<IsOverriddenAnnotation>(); |
116 |
return; |
119 |
try { |
117 |
} |
120 |
ParserManager.parse(Collections.singleton(result.getSnapshot().getSource()), new UserTask() { |
|
|
121 |
public @Override void run(ResultIterator resultIterator) throws Exception { |
122 |
Language language = LanguageRegistry.getInstance().getLanguageByMimeType(resultIterator.getSnapshot().getMimeType()); |
123 |
if(language != null) { //check for non csl results |
124 |
StructureScanner scanner = language.getStructure(); |
125 |
OverridingMethods om = language.getOverridingMethods(); |
126 |
if (scanner != null && om != null) { |
127 |
Parser.Result r = resultIterator.getParserResult(); |
128 |
if (r instanceof ParserResult) { |
129 |
Map<ElementHandle, Collection<? extends AlternativeLocation>> overriding = new HashMap<ElementHandle, Collection<? extends AlternativeLocation>>(); |
130 |
Map<ElementHandle, Collection<? extends AlternativeLocation>> overridden = new HashMap<ElementHandle, Collection<? extends AlternativeLocation>>(); |
131 |
Set<ElementHandle> seen = new HashSet<ElementHandle>(); |
132 |
Map<ElementHandle, ElementHandle> node2Parent = new HashMap<ElementHandle, ElementHandle>(); |
118 |
|
133 |
|
119 |
final List<IsOverriddenAnnotation> annotations = new LinkedList<IsOverriddenAnnotation>(); |
134 |
List<? extends StructureItem> children = ElementScanningTask.findCachedStructure(resultIterator.getSnapshot(), r); |
120 |
try { |
135 |
if (children == null) { |
121 |
ParserManager.parse(Collections.singleton(result.getSnapshot().getSource()), new UserTask() { |
136 |
long startTime = System.currentTimeMillis(); |
122 |
public @Override void run(ResultIterator resultIterator) throws Exception { |
137 |
children = scanner.scan((ParserResult) r); |
123 |
Language language = LanguageRegistry.getInstance().getLanguageByMimeType(resultIterator.getSnapshot().getMimeType()); |
|
|
124 |
if(language != null) { //check for non csl results |
125 |
StructureScanner scanner = language.getStructure(); |
126 |
OverridingMethods om = language.getOverridingMethods(); |
127 |
if (scanner != null && om != null) { |
128 |
Parser.Result r = resultIterator.getParserResult(); |
129 |
if (r instanceof ParserResult) { |
130 |
Map<ElementHandle, Collection<? extends AlternativeLocation>> overriding = new HashMap<ElementHandle, Collection<? extends AlternativeLocation>>(); |
131 |
Map<ElementHandle, Collection<? extends AlternativeLocation>> overridden = new HashMap<ElementHandle, Collection<? extends AlternativeLocation>>(); |
132 |
Set<ElementHandle> seen = new HashSet<ElementHandle>(); |
133 |
Map<ElementHandle, ElementHandle> node2Parent = new HashMap<ElementHandle, ElementHandle>(); |
134 |
|
135 |
List<? extends StructureItem> children = ElementScanningTask.findCachedStructure(resultIterator.getSnapshot(), r); |
136 |
if (children == null) { |
137 |
long startTime = System.currentTimeMillis(); |
138 |
children = scanner.scan((ParserResult) r); |
139 |
|
138 |
|
140 |
long endTime = System.currentTimeMillis(); |
139 |
long endTime = System.currentTimeMillis(); |
141 |
Logger.getLogger("TIMER").log(Level.FINE, "Structure (" + language.getMimeType() + ")", |
140 |
Logger.getLogger("TIMER").log(Level.FINE, "Structure (" + language.getMimeType() + ")", |
142 |
new Object[]{file, endTime - startTime}); |
141 |
new Object[]{file, endTime - startTime}); |
143 |
ElementScanningTask.markProcessed(r, children); |
142 |
ElementScanningTask.markProcessed(r, children); |
144 |
} |
143 |
} |
145 |
List<StructureItem> todo = new LinkedList<StructureItem>(children); |
144 |
List<StructureItem> todo = new LinkedList<StructureItem>(children); |
146 |
|
|
|
147 |
while (!todo.isEmpty()) { |
148 |
StructureItem i = todo.remove(0); |
149 |
|
145 |
|
150 |
todo.addAll(i.getNestedItems()); |
146 |
while (!todo.isEmpty()) { |
|
|
147 |
StructureItem i = todo.remove(0); |
151 |
|
148 |
|
152 |
for (StructureItem nested : i.getNestedItems()) { |
149 |
todo.addAll(i.getNestedItems()); |
153 |
if (!node2Parent.containsKey(nested.getElementHandle())) { |
150 |
|
154 |
node2Parent.put(nested.getElementHandle(), i.getElementHandle()); |
151 |
for (StructureItem nested : i.getNestedItems()) { |
|
|
152 |
if (!node2Parent.containsKey(nested.getElementHandle())) { |
153 |
node2Parent.put(nested.getElementHandle(), i.getElementHandle()); |
154 |
} |
155 |
} |
156 |
|
157 |
if (seen.add(i.getElementHandle())) { |
158 |
if (i.getElementHandle().getKind() != ElementKind.CLASS && i.getElementHandle().getKind() != ElementKind.INTERFACE) { |
159 |
Collection<? extends AlternativeLocation> ov = om.overrides((ParserResult) r, i.getElementHandle()); |
160 |
|
161 |
if (ov != null && !ov.isEmpty()) { |
162 |
overriding.put(i.getElementHandle(), ov); |
163 |
} |
164 |
} |
165 |
|
166 |
if (om.isOverriddenBySupported((ParserResult) r, i.getElementHandle())) { |
167 |
Collection<? extends AlternativeLocation> on = om.overriddenBy((ParserResult) r, i.getElementHandle()); |
168 |
|
169 |
if (on != null && !on.isEmpty()) { |
170 |
overridden.put(i.getElementHandle(), on); |
171 |
} |
172 |
} |
155 |
} |
173 |
} |
156 |
} |
174 |
} |
157 |
|
175 |
|
158 |
if (seen.add(i.getElementHandle())) { |
176 |
createAnnotations((ParserResult) r, doc, overriding, node2Parent, false, annotations); |
159 |
if (i.getElementHandle().getKind() != ElementKind.CLASS && i.getElementHandle().getKind() != ElementKind.INTERFACE) { |
177 |
createAnnotations((ParserResult) r, doc, overridden, node2Parent, true, annotations); |
160 |
Collection<? extends AlternativeLocation> ov = om.overrides((ParserResult) r, i.getElementHandle()); |
|
|
161 |
|
162 |
if (ov != null && !ov.isEmpty()) { |
163 |
overriding.put(i.getElementHandle(), ov); |
164 |
} |
165 |
} |
166 |
|
167 |
if (om.isOverriddenBySupported((ParserResult) r, i.getElementHandle())) { |
168 |
Collection<? extends AlternativeLocation> on = om.overriddenBy((ParserResult) r, i.getElementHandle()); |
169 |
|
170 |
if (on != null && !on.isEmpty()) { |
171 |
overridden.put(i.getElementHandle(), on); |
172 |
} |
173 |
} |
174 |
} |
175 |
} |
178 |
} |
176 |
|
|
|
177 |
createAnnotations((ParserResult) r, doc, overriding, node2Parent, false, annotations); |
178 |
createAnnotations((ParserResult) r, doc, overridden, node2Parent, true, annotations); |
179 |
} |
179 |
} |
180 |
} |
180 |
} |
|
|
181 |
|
182 |
for(Embedding e : resultIterator.getEmbeddings()) { |
183 |
run(resultIterator.getResultIterator(e)); |
184 |
} |
181 |
} |
185 |
} |
|
|
186 |
}); |
187 |
} catch (ParseException e) { |
188 |
LOG.log(Level.WARNING, null, e); |
189 |
} |
182 |
|
190 |
|
183 |
for(Embedding e : resultIterator.getEmbeddings()) { |
191 |
AnnotationsHolder holder = AnnotationsHolder.get(file); |
184 |
run(resultIterator.getResultIterator(e)); |
192 |
|
185 |
} |
193 |
if (holder != null) { |
186 |
} |
194 |
holder.setNewAnnotations(annotations); |
187 |
}); |
195 |
} |
188 |
} catch (ParseException e) { |
196 |
// Logger.getLogger("TIMER").log(Level.FINE, "Is Overridden Annotations", new Object[] {info.getFileObject(), end - start}); |
189 |
LOG.log(Level.WARNING, null, e); |
197 |
} finally { |
|
|
198 |
SpiSupportAccessor.getInstance().removeCancelSupport(cancel); |
190 |
} |
199 |
} |
191 |
|
200 |
|
192 |
AnnotationsHolder holder = AnnotationsHolder.get(file); |
|
|
193 |
|
194 |
if (holder != null) { |
195 |
holder.setNewAnnotations(annotations); |
196 |
} |
197 |
// Logger.getLogger("TIMER").log(Level.FINE, "Is Overridden Annotations", new Object[] {info.getFileObject(), end - start}); |
198 |
} |
201 |
} |
199 |
|
202 |
|
200 |
private void createAnnotations(ParserResult r, StyledDocument doc, Map<ElementHandle, Collection<? extends AlternativeLocation>> descriptions, Map<ElementHandle, ElementHandle> node2Parent, boolean overridden, List<IsOverriddenAnnotation> annotations) { |
203 |
private void createAnnotations(ParserResult r, StyledDocument doc, Map<ElementHandle, Collection<? extends AlternativeLocation>> descriptions, Map<ElementHandle, ElementHandle> node2Parent, boolean overridden, List<IsOverriddenAnnotation> annotations) { |
Lines 279-287
Link Here
|
279 |
|
282 |
|
280 |
@Override |
283 |
@Override |
281 |
public void cancel() { |
284 |
public void cancel() { |
282 |
cancel.set(true); |
|
|
283 |
} |
285 |
} |
284 |
|
286 |
|
285 |
private static Position getPosition(final StyledDocument doc, final int offset) { |
287 |
private static Position getPosition(final StyledDocument doc, final int offset) { |
286 |
class Impl implements Runnable { |
288 |
class Impl implements Runnable { |
287 |
private Position pos; |
289 |
private Position pos; |