Lines 68-73
Link Here
|
68 |
import org.netbeans.modules.php.editor.parser.astnodes.FunctionDeclaration; |
68 |
import org.netbeans.modules.php.editor.parser.astnodes.FunctionDeclaration; |
69 |
import org.netbeans.modules.php.editor.parser.astnodes.InterfaceDeclaration; |
69 |
import org.netbeans.modules.php.editor.parser.astnodes.InterfaceDeclaration; |
70 |
import org.netbeans.modules.php.editor.parser.astnodes.MethodDeclaration; |
70 |
import org.netbeans.modules.php.editor.parser.astnodes.MethodDeclaration; |
|
|
71 |
import org.netbeans.modules.php.editor.parser.astnodes.TraitDeclaration; |
71 |
import org.netbeans.modules.php.editor.parser.astnodes.visitors.DefaultVisitor; |
72 |
import org.netbeans.modules.php.editor.parser.astnodes.visitors.DefaultVisitor; |
72 |
|
73 |
|
73 |
/** |
74 |
/** |
Lines 126-142
Link Here
|
126 |
new Object[]{PHPTokenId.PHP_USE, PHPTokenId.WHITESPACE, PHPTokenId.PHP_FUNCTION, PHPTokenId.WHITESPACE, PHPTokenId.PHP_STRING}, |
127 |
new Object[]{PHPTokenId.PHP_USE, PHPTokenId.WHITESPACE, PHPTokenId.PHP_FUNCTION, PHPTokenId.WHITESPACE, PHPTokenId.PHP_STRING}, |
127 |
new Object[]{PHPTokenId.PHP_USE, PHPTokenId.WHITESPACE, PHPTokenId.PHP_FUNCTION, PHPTokenId.WHITESPACE, NAMESPACE_FALSE_TOKEN}, |
128 |
new Object[]{PHPTokenId.PHP_USE, PHPTokenId.WHITESPACE, PHPTokenId.PHP_FUNCTION, PHPTokenId.WHITESPACE, NAMESPACE_FALSE_TOKEN}, |
128 |
new Object[]{PHPTokenId.PHP_USE, PHPTokenId.WHITESPACE, PHPTokenId.PHP_FUNCTION, COMBINED_USE_STATEMENT_TOKENS}); |
129 |
new Object[]{PHPTokenId.PHP_USE, PHPTokenId.WHITESPACE, PHPTokenId.PHP_FUNCTION, COMBINED_USE_STATEMENT_TOKENS}); |
129 |
private static final List<Object[]> USE_TRAIT_KEYWORD_TOKENS = Arrays.asList( |
|
|
130 |
new Object[]{TYPE_KEYWORD, PHPTokenId.WHITESPACE, PHPTokenId.PHP_CURLY_OPEN, PHPTokenId.WHITESPACE, PHPTokenId.PHP_USE}, |
131 |
new Object[]{TYPE_KEYWORD, PHPTokenId.WHITESPACE, PHPTokenId.PHP_CURLY_OPEN, PHPTokenId.WHITESPACE, PHPTokenId.PHP_USE, PHPTokenId.WHITESPACE}, |
132 |
new Object[]{TYPE_KEYWORD, PHPTokenId.WHITESPACE, PHPTokenId.PHP_CURLY_OPEN, PHPTokenId.WHITESPACE, PHPTokenId.PHP_USE, PHPTokenId.WHITESPACE, PHPTokenId.PHP_STRING}, |
133 |
new Object[]{TYPE_KEYWORD, PHPTokenId.WHITESPACE, PHPTokenId.PHP_CURLY_OPEN, PHPTokenId.WHITESPACE, PHPTokenId.PHP_USE, PHPTokenId.WHITESPACE, NAMESPACE_FALSE_TOKEN}, |
134 |
new Object[]{TYPE_KEYWORD, PHPTokenId.WHITESPACE, PHPTokenId.PHP_CURLY_OPEN, PHPTokenId.WHITESPACE, PHPTokenId.PHP_USE, COMBINED_USE_STATEMENT_TOKENS}, |
135 |
new Object[]{TYPE_KEYWORD, PHPTokenId.PHP_CURLY_OPEN, PHPTokenId.WHITESPACE, PHPTokenId.PHP_USE}, |
136 |
new Object[]{TYPE_KEYWORD, PHPTokenId.PHP_CURLY_OPEN, PHPTokenId.WHITESPACE, PHPTokenId.PHP_USE, PHPTokenId.WHITESPACE}, |
137 |
new Object[]{TYPE_KEYWORD, PHPTokenId.PHP_CURLY_OPEN, PHPTokenId.WHITESPACE, PHPTokenId.PHP_USE, PHPTokenId.WHITESPACE, PHPTokenId.PHP_STRING}, |
138 |
new Object[]{TYPE_KEYWORD, PHPTokenId.PHP_CURLY_OPEN, PHPTokenId.WHITESPACE, PHPTokenId.PHP_USE, PHPTokenId.WHITESPACE, NAMESPACE_FALSE_TOKEN}, |
139 |
new Object[]{TYPE_KEYWORD, PHPTokenId.PHP_CURLY_OPEN, PHPTokenId.WHITESPACE, PHPTokenId.PHP_USE, COMBINED_USE_STATEMENT_TOKENS}); |
140 |
private static final List<Object[]> NAMESPACE_KEYWORD_TOKENS = Arrays.asList( |
130 |
private static final List<Object[]> NAMESPACE_KEYWORD_TOKENS = Arrays.asList( |
141 |
new Object[]{PHPTokenId.PHP_NAMESPACE}, |
131 |
new Object[]{PHPTokenId.PHP_NAMESPACE}, |
142 |
new Object[]{PHPTokenId.PHP_NAMESPACE, PHPTokenId.WHITESPACE}, |
132 |
new Object[]{PHPTokenId.PHP_NAMESPACE, PHPTokenId.WHITESPACE}, |
Lines 293-300
Link Here
|
293 |
return CompletionContext.PHPDOC; |
283 |
return CompletionContext.PHPDOC; |
294 |
} else if (acceptTokenChains(tokenSequence, CATCH_TOKENCHAINS, moveNextSucces)) { |
284 |
} else if (acceptTokenChains(tokenSequence, CATCH_TOKENCHAINS, moveNextSucces)) { |
295 |
return CompletionContext.CATCH; |
285 |
return CompletionContext.CATCH; |
296 |
} else if (acceptTokenChains(tokenSequence, USE_TRAIT_KEYWORD_TOKENS, moveNextSucces)) { |
286 |
} else if (acceptTokenChains(tokenSequence, NAMESPACE_KEYWORD_TOKENS, moveNextSucces)) { |
297 |
return CompletionContext.USE_TRAITS; |
287 |
return CompletionContext.NAMESPACE_KEYWORD; |
|
|
288 |
} else if (acceptTokenChains(tokenSequence, INSTANCEOF_TOKENCHAINS, moveNextSucces)) { |
289 |
return CompletionContext.TYPE_NAME; |
290 |
} else if (isInsideInterfaceDeclarationBlock(info, caretOffset, tokenSequence)) { |
291 |
CompletionContext paramContext = getParamaterContext(token, caretOffset, tokenSequence); |
292 |
if (paramContext != null) { |
293 |
return paramContext; |
294 |
} |
295 |
return CompletionContext.INTERFACE_CONTEXT_KEYWORDS; |
296 |
} else if (isInsideClassOrTraitDeclarationBlock(info, caretOffset, tokenSequence)) { |
297 |
if (acceptTokenChains(tokenSequence, USE_KEYWORD_TOKENS, moveNextSucces)) { |
298 |
return CompletionContext.USE_TRAITS; |
299 |
} else if (acceptTokenChains(tokenSequence, METHOD_NAME_TOKENCHAINS, moveNextSucces)) { |
300 |
return CompletionContext.METHOD_NAME; |
301 |
} else { |
302 |
CompletionContext paramContext = getParamaterContext(token, caretOffset, tokenSequence); |
303 |
if (paramContext != null) { |
304 |
return paramContext; |
305 |
} else if (acceptTokenChains(tokenSequence, CLASS_CONTEXT_KEYWORDS_TOKENCHAINS, moveNextSucces)) { |
306 |
return CompletionContext.CLASS_CONTEXT_KEYWORDS; |
307 |
} |
308 |
return CompletionContext.NONE; |
309 |
} |
298 |
} else if (acceptTokenChains(tokenSequence, GROUP_USE_KEYWORD_TOKENS, moveNextSucces)) { |
310 |
} else if (acceptTokenChains(tokenSequence, GROUP_USE_KEYWORD_TOKENS, moveNextSucces)) { |
299 |
return CompletionContext.GROUP_USE_KEYWORD; |
311 |
return CompletionContext.GROUP_USE_KEYWORD; |
300 |
} else if (acceptTokenChains(tokenSequence, GROUP_USE_CONST_KEYWORD_TOKENS, moveNextSucces)) { |
312 |
} else if (acceptTokenChains(tokenSequence, GROUP_USE_CONST_KEYWORD_TOKENS, moveNextSucces)) { |
Lines 307-334
Link Here
|
307 |
return CompletionContext.USE_CONST_KEYWORD; |
319 |
return CompletionContext.USE_CONST_KEYWORD; |
308 |
} else if (acceptTokenChains(tokenSequence, USE_FUNCTION_KEYWORD_TOKENS, moveNextSucces)) { |
320 |
} else if (acceptTokenChains(tokenSequence, USE_FUNCTION_KEYWORD_TOKENS, moveNextSucces)) { |
309 |
return CompletionContext.USE_FUNCTION_KEYWORD; |
321 |
return CompletionContext.USE_FUNCTION_KEYWORD; |
310 |
} else if (acceptTokenChains(tokenSequence, NAMESPACE_KEYWORD_TOKENS, moveNextSucces)) { |
|
|
311 |
return CompletionContext.NAMESPACE_KEYWORD; |
312 |
} else if (acceptTokenChains(tokenSequence, INSTANCEOF_TOKENCHAINS, moveNextSucces)) { |
313 |
return CompletionContext.TYPE_NAME; |
314 |
} else if (isInsideInterfaceDeclarationBlock(info, caretOffset, tokenSequence)) { |
315 |
CompletionContext paramContext = getParamaterContext(token, caretOffset, tokenSequence); |
316 |
if (paramContext != null) { |
317 |
return paramContext; |
318 |
} |
319 |
return CompletionContext.INTERFACE_CONTEXT_KEYWORDS; |
320 |
} else if (isInsideClassDeclarationBlock(info, caretOffset, tokenSequence)) { |
321 |
if (acceptTokenChains(tokenSequence, METHOD_NAME_TOKENCHAINS, moveNextSucces)) { |
322 |
return CompletionContext.METHOD_NAME; |
323 |
} else { |
324 |
CompletionContext paramContext = getParamaterContext(token, caretOffset, tokenSequence); |
325 |
if (paramContext != null) { |
326 |
return paramContext; |
327 |
} else if (acceptTokenChains(tokenSequence, CLASS_CONTEXT_KEYWORDS_TOKENCHAINS, moveNextSucces)) { |
328 |
return CompletionContext.CLASS_CONTEXT_KEYWORDS; |
329 |
} |
330 |
return CompletionContext.NONE; |
331 |
} |
332 |
} else if (acceptTokenChains(tokenSequence, FUNCTION_NAME_TOKENCHAINS, moveNextSucces)) { |
322 |
} else if (acceptTokenChains(tokenSequence, FUNCTION_NAME_TOKENCHAINS, moveNextSucces)) { |
333 |
return CompletionContext.NONE; |
323 |
return CompletionContext.NONE; |
334 |
} else if (isCommonCommentToken(tokenSequence)) { |
324 |
} else if (isCommonCommentToken(tokenSequence)) { |
Lines 982-1015
Link Here
|
982 |
return retval; |
972 |
return retval; |
983 |
} |
973 |
} |
984 |
|
974 |
|
985 |
private static synchronized boolean isInsideClassDeclarationBlock(ParserResult info, |
975 |
private static synchronized boolean isInsideClassOrTraitDeclarationBlock(ParserResult info, |
986 |
int caretOffset, TokenSequence tokenSequence) { |
976 |
int caretOffset, TokenSequence tokenSequence) { |
987 |
List<ASTNode> nodePath = NavUtils.underCaret(info, lexerToASTOffset(info, caretOffset)); |
977 |
List<ASTNode> nodePath = NavUtils.underCaret(info, lexerToASTOffset(info, caretOffset)); |
988 |
boolean methDecl = false; |
978 |
boolean methDecl = false; |
989 |
boolean funcDecl = false; |
979 |
boolean funcDecl = false; |
990 |
boolean clsDecl = false; |
980 |
boolean typeDecl = false; |
991 |
boolean isClassInsideFunc = false; |
981 |
boolean isTypeInsideFunc = false; |
992 |
boolean isFuncInsideClass = false; |
982 |
boolean isFuncInsideType = false; |
993 |
for (ASTNode aSTNode : nodePath) { |
983 |
for (ASTNode aSTNode : nodePath) { |
994 |
if (aSTNode instanceof FunctionDeclaration) { |
984 |
if (aSTNode instanceof FunctionDeclaration) { |
995 |
funcDecl = true; |
985 |
funcDecl = true; |
996 |
if (clsDecl) { |
986 |
if (typeDecl) { |
997 |
isFuncInsideClass = true; |
987 |
isFuncInsideType = true; |
998 |
} |
988 |
} |
999 |
} else if (aSTNode instanceof MethodDeclaration) { |
989 |
} else if (aSTNode instanceof MethodDeclaration) { |
1000 |
methDecl = true; |
990 |
methDecl = true; |
1001 |
} else if (aSTNode instanceof ClassDeclaration) { |
991 |
} else if (aSTNode instanceof ClassDeclaration |
|
|
992 |
|| aSTNode instanceof TraitDeclaration) { |
1002 |
if (aSTNode.getEndOffset() != caretOffset) { |
993 |
if (aSTNode.getEndOffset() != caretOffset) { |
1003 |
clsDecl = true; |
994 |
typeDecl = true; |
1004 |
if (funcDecl) { |
995 |
if (funcDecl) { |
1005 |
isClassInsideFunc = true; |
996 |
isTypeInsideFunc = true; |
1006 |
} |
997 |
} |
1007 |
} else { |
998 |
} else { |
1008 |
return false; |
999 |
return false; |
1009 |
} |
1000 |
} |
1010 |
} |
1001 |
} |
1011 |
} |
1002 |
} |
1012 |
if (funcDecl && !methDecl && !clsDecl) { |
1003 |
if (funcDecl && !methDecl && !typeDecl) { |
1013 |
final StringBuilder sb = new StringBuilder(); |
1004 |
final StringBuilder sb = new StringBuilder(); |
1014 |
new DefaultVisitor() { |
1005 |
new DefaultVisitor() { |
1015 |
|
1006 |
|
Lines 1023-1029
Link Here
|
1023 |
return false; |
1014 |
return false; |
1024 |
} |
1015 |
} |
1025 |
} |
1016 |
} |
1026 |
if (isClassInsideFunc && !isFuncInsideClass) { |
1017 |
if (isTypeInsideFunc && !isFuncInsideType) { |
1027 |
return true; |
1018 |
return true; |
1028 |
} |
1019 |
} |
1029 |
int orgOffset = tokenSequence.offset(); |
1020 |
int orgOffset = tokenSequence.offset(); |
Lines 1046-1054
Link Here
|
1046 |
|| id.equals(PHPTokenId.PHP_CATCH)) |
1037 |
|| id.equals(PHPTokenId.PHP_CATCH)) |
1047 |
&& (curlyOpen > curlyClose)) { |
1038 |
&& (curlyOpen > curlyClose)) { |
1048 |
return false; |
1039 |
return false; |
1049 |
} else if (id.equals(PHPTokenId.PHP_CLASS)) { |
1040 |
} else if (id.equals(PHPTokenId.PHP_CLASS) || id.equals(PHPTokenId.PHP_TRAIT)) { |
1050 |
boolean isClassScope = curlyOpen > 0 && (curlyOpen > curlyClose); |
1041 |
boolean isTypeScope = curlyOpen > 0 && (curlyOpen > curlyClose); |
1051 |
return isClassScope; |
1042 |
return isTypeScope; |
1052 |
} |
1043 |
} |
1053 |
} |
1044 |
} |
1054 |
} finally { |
1045 |
} finally { |