Lines 30-42
Link Here
|
30 |
*/ |
30 |
*/ |
31 |
package org.netbeans.modules.cnd.refactoring.elements; |
31 |
package org.netbeans.modules.cnd.refactoring.elements; |
32 |
|
32 |
|
|
|
33 |
import java.util.Collection; |
33 |
import java.util.EnumSet; |
34 |
import java.util.EnumSet; |
|
|
35 |
import java.util.concurrent.atomic.AtomicReference; |
34 |
import javax.swing.Icon; |
36 |
import javax.swing.Icon; |
35 |
import javax.swing.text.BadLocationException; |
37 |
import javax.swing.text.BadLocationException; |
36 |
import javax.swing.text.StyledDocument; |
38 |
import javax.swing.text.StyledDocument; |
37 |
import org.netbeans.api.editor.document.LineDocumentUtils; |
39 |
import org.netbeans.api.editor.document.LineDocumentUtils; |
|
|
40 |
import org.netbeans.api.lexer.Token; |
41 |
import org.netbeans.api.lexer.TokenId; |
42 |
import org.netbeans.api.lexer.TokenSequence; |
43 |
import org.netbeans.cnd.api.lexer.CndLexerUtilities; |
44 |
import org.netbeans.cnd.api.lexer.CppTokenId; |
38 |
import org.netbeans.editor.BaseDocument; |
45 |
import org.netbeans.editor.BaseDocument; |
39 |
import org.netbeans.modules.cnd.api.model.CsmFile; |
46 |
import org.netbeans.modules.cnd.api.model.CsmFile; |
|
|
47 |
import org.netbeans.modules.cnd.api.model.CsmObject; |
48 |
import org.netbeans.modules.cnd.api.model.util.CsmKindUtilities; |
40 |
import org.netbeans.modules.cnd.api.model.xref.CsmReference; |
49 |
import org.netbeans.modules.cnd.api.model.xref.CsmReference; |
41 |
import org.netbeans.modules.cnd.api.model.xref.CsmReferenceKind; |
50 |
import org.netbeans.modules.cnd.api.model.xref.CsmReferenceKind; |
42 |
import org.netbeans.modules.cnd.api.model.xref.CsmReferenceResolver; |
51 |
import org.netbeans.modules.cnd.api.model.xref.CsmReferenceResolver; |
Lines 60-65
Link Here
|
60 |
*/ |
69 |
*/ |
61 |
public class CsmRefactoringElementImpl extends SimpleRefactoringElementImplementation |
70 |
public class CsmRefactoringElementImpl extends SimpleRefactoringElementImplementation |
62 |
implements FiltersManager.Filterable { |
71 |
implements FiltersManager.Filterable { |
|
|
72 |
|
73 |
public enum RW { |
74 |
Read, |
75 |
Write, |
76 |
ReadWrite |
77 |
} |
63 |
private static final boolean LAZY = false; |
78 |
private static final boolean LAZY = false; |
64 |
private final CsmReference elem; |
79 |
private final CsmReference elem; |
65 |
private final PositionBounds bounds; |
80 |
private final PositionBounds bounds; |
Lines 72-80
Link Here
|
72 |
private final boolean isInMacros; |
87 |
private final boolean isInMacros; |
73 |
private final boolean isInDeadCode; |
88 |
private final boolean isInDeadCode; |
74 |
private final boolean isInComments; |
89 |
private final boolean isInComments; |
|
|
90 |
private final RW rw; |
75 |
|
91 |
|
76 |
public CsmRefactoringElementImpl(PositionBounds bounds, |
92 |
public CsmRefactoringElementImpl(PositionBounds bounds, |
77 |
CsmReference elem, FileObject fo, String displayText) { |
93 |
CsmReference elem, FileObject fo, String displayText, CsmObject referencedObject) { |
78 |
this.elem = elem; |
94 |
this.elem = elem; |
79 |
this.bounds = bounds; |
95 |
this.bounds = bounds; |
80 |
this.fo = fo; |
96 |
this.fo = fo; |
Lines 90-95
Link Here
|
90 |
this.isInMacros = CsmReferenceResolver.getDefault().isKindOf(elem, EnumSet.of(CsmReferenceKind.IN_PREPROCESSOR_DIRECTIVE)); |
106 |
this.isInMacros = CsmReferenceResolver.getDefault().isKindOf(elem, EnumSet.of(CsmReferenceKind.IN_PREPROCESSOR_DIRECTIVE)); |
91 |
this.isInDeadCode = CsmReferenceResolver.getDefault().isKindOf(elem, EnumSet.of(CsmReferenceKind.IN_DEAD_BLOCK)); |
107 |
this.isInDeadCode = CsmReferenceResolver.getDefault().isKindOf(elem, EnumSet.of(CsmReferenceKind.IN_DEAD_BLOCK)); |
92 |
this.isInComments = CsmReferenceResolver.getDefault().isKindOf(elem, EnumSet.of(CsmReferenceKind.COMMENT)); |
108 |
this.isInComments = CsmReferenceResolver.getDefault().isKindOf(elem, EnumSet.of(CsmReferenceKind.COMMENT)); |
|
|
109 |
if (referencedObject != null && CsmKindUtilities.isVariable(referencedObject)) { |
110 |
this.rw = getRW(elem); |
111 |
} else { |
112 |
this.rw = RW.Read; |
113 |
} |
93 |
} |
114 |
} |
94 |
|
115 |
|
95 |
private boolean isScope(CsmReference ref) { |
116 |
private boolean isScope(CsmReference ref) { |
Lines 111-117
Link Here
|
111 |
} |
132 |
} |
112 |
return false; |
133 |
return false; |
113 |
} |
134 |
} |
114 |
|
135 |
|
|
|
136 |
private RW getRW(final CsmReference ref) { |
137 |
final AtomicReference<RW> out = new AtomicReference<>(RW.Write); |
138 |
CsmFile csmFile = ref.getContainingFile(); |
139 |
CloneableEditorSupport ces = CsmUtilities.findCloneableEditorSupport(csmFile); |
140 |
StyledDocument stDoc = CsmUtilities.openDocument(ces); |
141 |
if (stDoc instanceof BaseDocument) { |
142 |
final BaseDocument doc = (BaseDocument) stDoc; |
143 |
doc.render(new Runnable() { |
144 |
@Override |
145 |
public void run() { |
146 |
int offset = ref.getStartOffset(); |
147 |
TokenSequence<TokenId> cppTokenSequence = CndLexerUtilities.getCppTokenSequence(doc, offset, true, false); |
148 |
if (cppTokenSequence == null) { |
149 |
return; |
150 |
} |
151 |
CppTokenId nextImportantToken = null; |
152 |
cppTokenSequence.move(offset); |
153 |
if (cppTokenSequence.moveNext()) { |
154 |
next: |
155 |
while (cppTokenSequence.moveNext()) { |
156 |
Token<TokenId> token = cppTokenSequence.token(); |
157 |
TokenId id = token.id(); |
158 |
if (id instanceof CppTokenId) { |
159 |
switch ((CppTokenId) id) { |
160 |
// skip unimportant |
161 |
case WHITESPACE: |
162 |
case ESCAPED_LINE: |
163 |
case ESCAPED_WHITESPACE: |
164 |
case NEW_LINE: |
165 |
case LINE_COMMENT: |
166 |
case BLOCK_COMMENT: |
167 |
case DOXYGEN_COMMENT: |
168 |
case DOXYGEN_LINE_COMMENT: |
169 |
break; |
170 |
// asignments |
171 |
case EQ: |
172 |
case PLUSEQ: |
173 |
case MINUSEQ: |
174 |
case STAREQ: |
175 |
case SLASHEQ: |
176 |
case AMPEQ: |
177 |
case BAREQ: |
178 |
case CARETEQ: |
179 |
case PERCENTEQ: |
180 |
case LTLTEQ: |
181 |
case GTGTEQ: |
182 |
// increments |
183 |
case PLUSPLUS: |
184 |
case MINUSMINUS: |
185 |
out.set(RW.Write); |
186 |
return; |
187 |
// supose that binary operators have a read access |
188 |
case PLUS: |
189 |
case MINUS: |
190 |
case GT: |
191 |
case LT: |
192 |
case QUESTION: |
193 |
case EQEQ: |
194 |
case LTEQ: |
195 |
case GTEQ: |
196 |
case NOTEQ: |
197 |
case AMPAMP: |
198 |
case BARBAR: |
199 |
case STAR: |
200 |
case SLASH: |
201 |
case BAR: |
202 |
case CARET: |
203 |
case PERCENT: |
204 |
case LTLT: |
205 |
case GTGT: |
206 |
out.set(RW.Read); |
207 |
return; |
208 |
case COMMA: |
209 |
case COLON: |
210 |
case SEMICOLON: |
211 |
case RBRACKET: |
212 |
case RPAREN: |
213 |
case DOT: |
214 |
case DOTMBR: |
215 |
case ARROW: |
216 |
case ARROWMBR: |
217 |
case SCOPE: |
218 |
nextImportantToken = (CppTokenId) id; |
219 |
break next; |
220 |
default: |
221 |
break next; |
222 |
} |
223 |
} |
224 |
} |
225 |
} |
226 |
|
227 |
cppTokenSequence.move(offset); |
228 |
prev: |
229 |
while (cppTokenSequence.movePrevious()) { |
230 |
Token<TokenId> token = cppTokenSequence.token(); |
231 |
TokenId id = token.id(); |
232 |
if (id instanceof CppTokenId) { |
233 |
switch ((CppTokenId) id) { |
234 |
// skip unimportant |
235 |
case WHITESPACE: |
236 |
case ESCAPED_LINE: |
237 |
case ESCAPED_WHITESPACE: |
238 |
case NEW_LINE: |
239 |
case LINE_COMMENT: |
240 |
case BLOCK_COMMENT: |
241 |
case DOXYGEN_COMMENT: |
242 |
case DOXYGEN_LINE_COMMENT: |
243 |
break; |
244 |
// increments |
245 |
case PLUSPLUS: |
246 |
case MINUSMINUS: |
247 |
out.set(RW.Write); |
248 |
return; |
249 |
case EQ: |
250 |
case PLUSEQ: |
251 |
case MINUSEQ: |
252 |
case STAREQ: |
253 |
case SLASHEQ: |
254 |
case AMPEQ: |
255 |
case BAREQ: |
256 |
case CARETEQ: |
257 |
case PERCENTEQ: |
258 |
case LTLTEQ: |
259 |
case GTGTEQ: |
260 |
out.set(RW.Read); |
261 |
return; |
262 |
// supose that unary operators have a read access |
263 |
case NOT: |
264 |
case TILDE: |
265 |
out.set(RW.Read); |
266 |
return; |
267 |
// supose that unary/binary operators have a read access |
268 |
case PLUS: |
269 |
case MINUS: |
270 |
out.set(RW.Read); |
271 |
return; |
272 |
// supose that binary operators have a read access |
273 |
case GT: |
274 |
case LT: |
275 |
case QUESTION: |
276 |
case EQEQ: |
277 |
case LTEQ: |
278 |
case GTEQ: |
279 |
case NOTEQ: |
280 |
case AMPAMP: |
281 |
case BARBAR: |
282 |
case STAR: |
283 |
case SLASH: |
284 |
case BAR: |
285 |
case CARET: |
286 |
case PERCENT: |
287 |
case LTLT: |
288 |
case GTGT: |
289 |
out.set(RW.Read); |
290 |
return; |
291 |
//needs further investigation |
292 |
case COMMA: |
293 |
case LPAREN: |
294 |
case DOT: |
295 |
case DOTMBR: |
296 |
case ARROW: |
297 |
case ARROWMBR: |
298 |
case SCOPE: |
299 |
out.set(RW.Read); |
300 |
return; |
301 |
//needs further investigation |
302 |
case AMP: |
303 |
out.set(RW.Read); |
304 |
return; |
305 |
//needs further investigation |
306 |
default: |
307 |
out.set(RW.Read); |
308 |
return; |
309 |
} |
310 |
} |
311 |
} |
312 |
} |
313 |
}); |
314 |
} |
315 |
return out.get(); |
316 |
} |
317 |
|
115 |
@Override |
318 |
@Override |
116 |
public String getText() { |
319 |
public String getText() { |
117 |
return elem.getText().toString(); |
320 |
return elem.getText().toString(); |
Lines 153-168
Link Here
|
153 |
return "{" + "bounds=" + bounds + ", displayText=" + displayText + ", enclosing=" + enclosing + ", fo=" + fo + '}'; // NOI18N |
356 |
return "{" + "bounds=" + bounds + ", displayText=" + displayText + ", enclosing=" + enclosing + ", fo=" + fo + '}'; // NOI18N |
154 |
} |
357 |
} |
155 |
|
358 |
|
156 |
public static RefactoringElementImplementation create(CsmReference ref,boolean nameInBold) { |
359 |
public static RefactoringElementImplementation create(CsmReference ref, boolean nameInBold, CsmObject referencedObject) { |
157 |
CsmFile csmFile = ref.getContainingFile(); |
360 |
CsmFile csmFile = ref.getContainingFile(); |
158 |
FileObject fo = CsmUtilities.getFileObject(csmFile); |
361 |
FileObject fo = CsmUtilities.getFileObject(csmFile); |
159 |
PositionBounds bounds = CsmUtilities.createPositionBounds(ref); |
362 |
PositionBounds bounds = CsmUtilities.createPositionBounds(ref); |
160 |
String displayText = LAZY ? null : CsmReferenceSupport.getContextLineHtml(ref, nameInBold).toString(); |
363 |
String displayText = LAZY ? null : CsmReferenceSupport.getContextLineHtml(ref, nameInBold).toString(); |
161 |
return new CsmRefactoringElementImpl(bounds, ref, fo, displayText); |
364 |
return new CsmRefactoringElementImpl(bounds, ref, fo, displayText, referencedObject); |
162 |
} |
365 |
} |
163 |
|
366 |
|
164 |
@Override |
367 |
@Override |
165 |
public boolean filter(FiltersManager manager) { |
368 |
public boolean filter(FiltersManager manager) { |
|
|
369 |
if (rw == RW.Read && !manager.isSelected(CsmWhereUsedFilters.READ.getKey())) { |
370 |
return false; |
371 |
} |
372 |
if (rw == RW.Write && !manager.isSelected(CsmWhereUsedFilters.WRITE.getKey())) { |
373 |
return false; |
374 |
} |
375 |
if (rw == RW.ReadWrite && !manager.isSelected(CsmWhereUsedFilters.READ_WRITE.getKey())) { |
376 |
return false; |
377 |
} |
166 |
if (isDecl && !manager.isSelected(CsmWhereUsedFilters.DECLARATIONS.getKey())) { |
378 |
if (isDecl && !manager.isSelected(CsmWhereUsedFilters.DECLARATIONS.getKey())) { |
167 |
return false; |
379 |
return false; |
168 |
} |
380 |
} |