Skip to content
This repository has been archived by the owner on Dec 15, 2022. It is now read-only.

new operator does not work well with full qualifier #181

Open
felixhao28 opened this issue Dec 3, 2018 · 7 comments
Open

new operator does not work well with full qualifier #181

felixhao28 opened this issue Dec 3, 2018 · 7 comments

Comments

@felixhao28
Copy link

felixhao28 commented Dec 3, 2018

Description

public class A {
    void f() {
        java.io.File myFile = java.io.File.create(folderPath);
        java.io.File myFile = new java.io.File(folderPath);
    }
}

image

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".

@sadikovi
Copy link
Contributor

sadikovi commented Dec 3, 2018

Can you include the language-java version that you are testing against?

@felixhao28
Copy link
Author

d48e713

@felixhao28
Copy link
Author

might be related, extends does not work well with full qualifiers either:

class RenderType extends com.jfinal.plugin.ehcache.RenderType {
    public static final int BEETL_RENDER = 6;
}

image

@sadikovi
Copy link
Contributor

sadikovi commented Dec 4, 2018

This looks like a regression, because it was fixed at some point, if I remember correctly. I will investigate.

@Vigilans
Copy link
Contributor

Vigilans commented Nov 27, 2019

The regression is caused in these lines:

# If the above fails *then* just look for Wow
# (must be followed by a variable name, we use '\n' to cover multi-line definitions,
# or varargs for function definitions)
'match': '\\b((?:[A-Za-z_]\\w*\\s*\\.\\s*)*[A-Z_]\\w*)\\b((?=\\s*[A-Za-z$_\\n])|(?=\\s*\\.\\.\\.))'

the constraint must be followed by a variable name prevents java.io.File to be recognized as a type.

@sadikovi
Copy link
Contributor

sadikovi commented Dec 7, 2019

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).

@Vigilans
Copy link
Contributor

Vigilans commented Dec 7, 2019

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 to object-type, to allow type to be recognized in a constructor call.
  • Remove function-call and parens from anonymous-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'

Effect:


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.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants