`new` operator does not work well with full qualifier
Opened this issue · 7 comments
Description
public class A {
void f() {
java.io.File myFile = java.io.File.create(folderPath);
java.io.File myFile = new java.io.File(folderPath);
}
}
Expected behavior: [What you expect to happen]
"java.io" after new
is not recognized as part of class name. It should be separated "java", ".", "io".
Can you include the language-java version that you are testing against?
This looks like a regression, because it was fixed at some point, if I remember correctly. I will investigate.
The regression is caused in these lines:
language-java/grammars/java.cson
Lines 1059 to 1062 in 47ddbb6
the constraint must be followed by a variable name
prevents java.io.File
to be recognized as a type.
That's not correct. It does get recognised, the regex skips the first item in fully qualified class name - just need to fix that. It would be tricky to fix all of the situations - I have a tree-sitter PR that would address this issue (and bunch of others).
It would be fixed naturally if java.io.File
is recoginized as a type and fall into object-type
scope to be parsed...
@sadikovi If you agree type in constructor call should be rendered as type (where langs like cpp & ts do so), you can take a look at this branch at your convenience, which is come up to solve #216.
It is simple enough by just doing following things:
- Add
(?=\\()
match toobject-type
, to allow type to be recognized in a constructor call. - Remove
function-call
andparens
fromanonymous-classes-and-new
, and patch a(...)
matching for constructor calls. - Fix the udpated scopes in test by:
- Replace all 'meta.function-call.java', 'entity.name.function.java' with 'storage.type.java';
- Remove 'meta.function-call.java' before 'punctuation.definition.parameters.*.bracket.round.java'
Update:
Oh, sorry for that I ignored the extends
case. What I talked about is about the new
case in the title, and it's related to object-type
. The extends
case is caused by object-type-inherited
.