4343import org .eclipse .jdt .core .search .SearchParticipant ;
4444import org .eclipse .jdt .core .search .SearchPattern ;
4545import org .eclipse .jdt .core .search .SearchRequestor ;
46+ import org .eclipse .jdt .internal .core .SourceMethod ;
4647import org .eclipse .jdt .ls .core .internal .ProjectUtils ;
4748import org .eclipse .jdt .ls .core .internal .ResourceUtils ;
4849import org .eclipse .jdt .ls .core .internal .managers .ProjectsManager ;
@@ -101,49 +102,44 @@ private List<ResolutionItem> resolveMainClassUnderPaths(List<IPath> parentPaths)
101102 // Limit to search main method from source code only.
102103 IJavaSearchScope searchScope = SearchEngine .createJavaSearchScope (ProjectUtils .getJavaProjects (),
103104 IJavaSearchScope .REFERENCED_PROJECTS | IJavaSearchScope .SOURCES );
104- SearchPattern pattern = SearchPattern .createPattern ("main(String[]) void" , IJavaSearchConstants .METHOD ,
105- IJavaSearchConstants .DECLARATIONS , SearchPattern .R_CASE_SENSITIVE | SearchPattern .R_EXACT_MATCH );
105+ SearchPattern pattern = createMainMethodSearchPattern ();
106106 final List <ResolutionItem > res = new ArrayList <>();
107107 SearchRequestor requestor = new SearchRequestor () {
108108 @ Override
109109 public void acceptSearchMatch (SearchMatch match ) {
110110 Object element = match .getElement ();
111111 if (element instanceof IMethod ) {
112112 IMethod method = (IMethod ) element ;
113- try {
114- if (method .isMainMethod ()) {
115- IResource resource = method .getResource ();
116- if (resource != null ) {
117- IProject project = resource .getProject ();
118- if (project != null ) {
119- String mainClass = method .getDeclaringType ().getFullyQualifiedName ();
120- IJavaProject javaProject = JdtUtils .getJavaProject (project );
121- if (javaProject != null ) {
122- String moduleName = JdtUtils .getModuleName (javaProject );
123- if (moduleName != null ) {
124- mainClass = moduleName + "/" + mainClass ;
125- }
113+ if (isMainMethod (method )) {
114+ IResource resource = method .getResource ();
115+ if (resource != null ) {
116+ IProject project = resource .getProject ();
117+ if (project != null ) {
118+ String mainClass = method .getDeclaringType ().getFullyQualifiedName ();
119+ IJavaProject javaProject = JdtUtils .getJavaProject (project );
120+ if (javaProject != null ) {
121+ String moduleName = JdtUtils .getModuleName (javaProject );
122+ if (moduleName != null ) {
123+ mainClass = moduleName + "/" + mainClass ;
126124 }
127- String projectName = ProjectsManager . DEFAULT_PROJECT_NAME . equals ( project . getName ()) ? null : project . getName ();
128- if ( parentPaths . isEmpty ()
129- || ResourceUtils . isContainedIn ( project . getLocation (), parentPaths )
130- || isContainedInInvisibleProject (project , parentPaths )) {
131- String filePath = null ;
132-
133- if ( match . getResource () instanceof IFile ) {
134- try {
135- filePath = match . getResource (). getLocation (). toOSString ();
136- } catch ( Exception ex ) {
137- // ignore
138- }
125+ }
126+ String projectName = ProjectsManager . DEFAULT_PROJECT_NAME . equals ( project . getName ()) ? null : project . getName ();
127+ if ( parentPaths . isEmpty ( )
128+ || ResourceUtils . isContainedIn (project . getLocation () , parentPaths )
129+ || isContainedInInvisibleProject ( project , parentPaths )) {
130+ String filePath = null ;
131+
132+ if ( match . getResource () instanceof IFile ) {
133+ try {
134+ filePath = match . getResource (). getLocation (). toOSString ();
135+ } catch ( Exception ex ) {
136+ // ignore
139137 }
140- res .add (new ResolutionItem (mainClass , projectName , filePath ));
141138 }
139+ res .add (new ResolutionItem (mainClass , projectName , filePath ));
142140 }
143141 }
144142 }
145- } catch (JavaModelException e ) {
146- // ignore
147143 }
148144 }
149145 }
@@ -166,44 +162,39 @@ private List<ResolutionItem> resolveMainClassUnderProject(final String projectNa
166162 IJavaProject javaProject = ProjectUtils .getJavaProject (projectName );
167163 IJavaSearchScope searchScope = SearchEngine .createJavaSearchScope (javaProject == null ? new IJavaProject [0 ] : new IJavaProject [] {javaProject },
168164 IJavaSearchScope .REFERENCED_PROJECTS | IJavaSearchScope .SOURCES );
169- SearchPattern pattern = SearchPattern .createPattern ("main(String[]) void" , IJavaSearchConstants .METHOD ,
170- IJavaSearchConstants .DECLARATIONS , SearchPattern .R_CASE_SENSITIVE | SearchPattern .R_EXACT_MATCH );
165+ SearchPattern pattern = createMainMethodSearchPattern ();
171166 final List <ResolutionItem > res = new ArrayList <>();
172167 SearchRequestor requestor = new SearchRequestor () {
173168 @ Override
174169 public void acceptSearchMatch (SearchMatch match ) {
175170 Object element = match .getElement ();
176171 if (element instanceof IMethod ) {
177172 IMethod method = (IMethod ) element ;
178- try {
179- if (method .isMainMethod ()) {
180- IResource resource = method .getResource ();
181- if (resource != null ) {
182- IProject project = resource .getProject ();
183- if (project != null ) {
184- String mainClass = method .getDeclaringType ().getFullyQualifiedName ();
185- IJavaProject javaProject = JdtUtils .getJavaProject (project );
186- if (javaProject != null ) {
187- String moduleName = JdtUtils .getModuleName (javaProject );
188- if (moduleName != null ) {
189- mainClass = moduleName + "/" + mainClass ;
190- }
173+ if (isMainMethod (method )) {
174+ IResource resource = method .getResource ();
175+ if (resource != null ) {
176+ IProject project = resource .getProject ();
177+ if (project != null ) {
178+ String mainClass = method .getDeclaringType ().getFullyQualifiedName ();
179+ IJavaProject javaProject = JdtUtils .getJavaProject (project );
180+ if (javaProject != null ) {
181+ String moduleName = JdtUtils .getModuleName (javaProject );
182+ if (moduleName != null ) {
183+ mainClass = moduleName + "/" + mainClass ;
191184 }
185+ }
192186
193- String filePath = null ;
194- if (match .getResource () instanceof IFile ) {
195- try {
196- filePath = match .getResource ().getLocation ().toOSString ();
197- } catch (Exception ex ) {
198- // ignore
199- }
187+ String filePath = null ;
188+ if (match .getResource () instanceof IFile ) {
189+ try {
190+ filePath = match .getResource ().getLocation ().toOSString ();
191+ } catch (Exception ex ) {
192+ // ignore
200193 }
201- res .add (new ResolutionItem (mainClass , projectName , filePath ));
202194 }
195+ res .add (new ResolutionItem (mainClass , projectName , filePath ));
203196 }
204197 }
205- } catch (JavaModelException e ) {
206- // ignore
207198 }
208199 }
209200 }
@@ -221,6 +212,29 @@ public void acceptSearchMatch(SearchMatch match) {
221212 return resolutions ;
222213 }
223214
215+ private SearchPattern createMainMethodSearchPattern () {
216+ SearchPattern pattern1 = SearchPattern .createPattern ("main(String[]) void" , IJavaSearchConstants .METHOD ,
217+ IJavaSearchConstants .DECLARATIONS , SearchPattern .R_CASE_SENSITIVE | SearchPattern .R_EXACT_MATCH );
218+ SearchPattern pattern2 = SearchPattern .createPattern ("main() void" , IJavaSearchConstants .METHOD ,
219+ IJavaSearchConstants .DECLARATIONS , SearchPattern .R_CASE_SENSITIVE | SearchPattern .R_EXACT_MATCH );
220+ return SearchPattern .createOrPattern (pattern1 , pattern2 );
221+ }
222+
223+ private boolean isMainMethod (IMethod method ) {
224+ try {
225+ if (method instanceof SourceMethod
226+ && ((SourceMethod ) method ).isMainMethodCandidate ()) {
227+ return true ;
228+ }
229+
230+ return method .isMainMethod ();
231+ } catch (JavaModelException e ) {
232+ // do nothing
233+ }
234+
235+ return false ;
236+ }
237+
224238 private boolean isContainedInInvisibleProject (IProject project , Collection <IPath > rootPaths ) {
225239 if (project == null ) {
226240 return false ;
0 commit comments