Skip to content

Commit 3022ea4

Browse files
authored
Merge pull request #26 from SergeevPavel/master
treat .edn as clojure file and fix resolve in java hierarchies
2 parents b1c913b + 2192c46 commit 3022ea4

File tree

6 files changed

+56
-26
lines changed

6 files changed

+56
-26
lines changed

src/clojure-constants.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ object ClojureConstants {
3535
@JvmStatic val CLJS = "cljs"
3636
@JvmStatic val CLJ = "clj"
3737
@JvmStatic val CLJC = "cljc"
38+
@JvmStatic val EDN = "edn"
3839

3940
@JvmStatic val NS_USER = "user"
4041
@JvmStatic val NS_SPEC = "clojure.spec"

src/lang/clojure-language.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ import org.intellij.clojure.util.thisForm
5353
*/
5454
class ClojureFileTypeFactory : FileTypeFactory() {
5555
override fun createFileTypes(consumer: FileTypeConsumer) {
56-
consumer.consume(ClojureFileType, "${ClojureConstants.CLJ};${ClojureConstants.CLJS};${ClojureConstants.CLJC}")
56+
consumer.consume(ClojureFileType, "${ClojureConstants.CLJ};${ClojureConstants.CLJS};${ClojureConstants.CLJC};${ClojureConstants.EDN}")
5757
consumer.consume(ClojureFileType, WildcardFileNameMatcher(ClojureConstants.BOOT_CONFIG))
5858
}
5959
}

src/lang/clojure-psi-java.kt

Lines changed: 48 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import com.intellij.util.ObjectUtils
4646
import com.intellij.util.containers.ContainerUtil
4747
import com.intellij.util.containers.ContainerUtilRt
4848
import com.intellij.util.containers.JBIterable
49+
import com.intellij.util.containers.JBTreeTraverser
4950
import org.intellij.clojure.ClojureConstants
5051
import org.intellij.clojure.psi.impl.ClojureDefinitionService
5152
import org.intellij.clojure.util.EachNth
@@ -142,30 +143,49 @@ abstract class JavaHelper {
142143
override fun findPackage(packageName: String?, withClass: String?): NavigatablePsiElement? =
143144
myFacade.findPackage(packageName!!) as? NavigatablePsiElement ?: asm.findPackage(packageName, withClass)
144145

146+
internal fun superclasses(className: String?) = JBTreeTraverser<PsiClass> { o ->
147+
JBIterable.of(o.superClass).append(o.interfaces)
148+
}
149+
.withRoot(findClass(className) as? PsiClass)
150+
.unique()
151+
.traverse()
152+
153+
145154
override fun findClassMethods(className: String?,
146155
scope: Scope,
147156
name: String?,
148157
paramCount: Int,
149-
vararg paramTypes: String): List<NavigatablePsiElement> {
150-
val aClass = findClass(className) as? PsiClass ?: return asm.findClassMethods(className, scope, name, paramCount, *paramTypes)
151-
val methods = if (scope == Scope.INIT) aClass.constructors.jbIt()
152-
else JBIterable.generate(aClass) { it.superClass }.flatMap { it!!.methods.jbIt() }
153-
return methods.map { o ->
154-
if (acceptsName(name, o.name) &&
155-
acceptsMethod(o, scope == Scope.STATIC) &&
156-
acceptsMethod(myElementFactory, o, paramCount, *paramTypes)) o else null
157-
}.notNulls().toList()
158-
}
158+
vararg paramTypes: String): List<NavigatablePsiElement> =
159+
if (findClass(className) !is PsiClass) {
160+
asm.findClassMethods(className, scope, name, paramCount, *paramTypes)
161+
}
162+
else {
163+
superclasses(className)
164+
.flatten {
165+
if (scope == Scope.INIT) it.constructors.jbIt() else it.methods.jbIt()
166+
}
167+
.filter {
168+
acceptsName(name, it.name) &&
169+
acceptsMethod(it, scope == Scope.STATIC) &&
170+
acceptsMethod(myElementFactory, it, paramCount, *paramTypes)
171+
}
172+
.notNulls()
173+
.toList()
174+
}
159175

160-
override fun findClassFields(className: String?, scope: Scope, name: String?): List<NavigatablePsiElement> {
161-
val aClass = findClass(className) as? PsiClass ?: return asm.findClassFields(className, scope, name)
162-
val fields = JBIterable.generate(aClass) { it.superClass }.flatMap { it!!.fields.jbIt() }
163-
return fields.map { o ->
164-
if (acceptsName(name, o.name) &&
165-
acceptsMethod(o, scope == Scope.STATIC)) o
166-
else null
167-
}.notNulls().toList()
168-
}
176+
override fun findClassFields(className: String?, scope: Scope, name: String?): List<NavigatablePsiElement> =
177+
if (findClass(className) !is PsiClass) {
178+
asm.findClassFields(className, scope, name)
179+
}
180+
else superclasses(className)
181+
.flatten {
182+
it.fields.jbIt()
183+
}
184+
.filter {
185+
acceptsName(name, it.name) &&
186+
acceptsMethod(it, scope == Scope.STATIC)
187+
}
188+
.notNulls().toList()
169189

170190
override fun getSuperClassName(className: String?): String? {
171191
val aClass = findClass(className) as? PsiClass ?: return asm.getSuperClassName(className)
@@ -309,8 +329,15 @@ abstract class JavaHelper {
309329
internal fun cached(id: String, info: Any) =
310330
map[id] ?: ConcurrencyUtil.cacheOrGet(map, id, MyElement(project, info))
311331

312-
internal fun superclasses(name: String?) = JBIterable.generate(findClass(name)) {
313-
findClass((it?.delegate as? ClassInfo)?.superClass)}.notNulls()
332+
internal fun superclasses(name: String?) = JBTreeTraverser<MyElement<*>> { o ->
333+
JBIterable.of((o.delegate as? ClassInfo)?.superClass)
334+
.append((o.delegate as? ClassInfo)?.interfaces)
335+
.map(this@AsmHelper::findClass)
336+
.notNulls()
337+
}
338+
.withRoot(findClass(name))
339+
.unique()
340+
.traverse()
314341

315342
override fun findClassMethods(className: String?,
316343
scope: Scope,

testData/highlighting/ClojureLang.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/clojure/core.clj 0 errors, 8 warnings, 19 dynamic
1+
/clojure/core.clj 0 errors, 8 warnings, 13 dynamic
22
123975: unable to resolve 'setInt'
33
124114: unable to resolve 'setLong'
44
124261: unable to resolve 'setBoolean'
@@ -13,7 +13,7 @@
1313
2113: unable to resolve 'jsr166y.ForkJoinTask'
1414
2178: unable to resolve 'jsr166y.ForkJoinTask'
1515
/clojure/core/server.clj 0 errors, 0 warnings, 4 dynamic
16-
/clojure/core_deftype.clj 0 errors, 0 warnings, 13 dynamic
16+
/clojure/core_deftype.clj 0 errors, 0 warnings, 11 dynamic
1717
/clojure/core_instant18.clj 0 errors, 0 warnings, 0 dynamic
1818
/clojure/core_print.clj 0 errors, 0 warnings, 0 dynamic
1919
/clojure/core_proxy.clj 0 errors, 3 warnings, 0 dynamic
@@ -25,7 +25,7 @@
2525
2620: unable to resolve 'isArray'
2626
/clojure/edn.clj 0 errors, 0 warnings, 0 dynamic
2727
/clojure/genclass.clj 0 errors, 0 warnings, 2 dynamic
28-
/clojure/gvec.clj 0 errors, 0 warnings, 47 dynamic
28+
/clojure/gvec.clj 0 errors, 0 warnings, 45 dynamic
2929
/clojure/inspector.clj 0 errors, 0 warnings, 11 dynamic
3030
/clojure/instant.clj 0 errors, 0 warnings, 5 dynamic
3131
/clojure/java/browse.clj 0 errors, 0 warnings, 2 dynamic

testData/highlighting/ClojureScript.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
/cljs/analyzer/macros.clj 0 errors, 0 warnings, 1 dynamic
2828
/cljs/analyzer/utils.clj 0 errors, 0 warnings, 0 dynamic
2929
/cljs/build/api.clj 0 errors, 0 warnings, 0 dynamic
30-
/cljs/closure.clj 0 errors, 14 warnings, 53 dynamic
30+
/cljs/closure.clj 0 errors, 14 warnings, 52 dynamic
3131
13343: unable to resolve 'setExtraAnnotationNames'
3232
55993: unable to resolve 'read-str'
3333
61410: unable to resolve 'write-str'

tests/lang/completion-tests.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ class ClojureCompletionTest : LightPlatformCodeInsightFixtureTestCase() {
8282
fun testInsideImport3() = doTest("(require [clojure.string :refer [<caret>]])", "blank?")
8383
fun testInsideImport4() = doNegTest("(require [clojure.string :refer [<caret>]])", "def")
8484

85+
fun testJava1() = doPosTest("(defn a [^java.util.SortedSet a] (.<caret> a))", "comparator", "size", "contains", "add")
86+
8587

8688
private fun doTest(text: String, select: String,
8789
expected: String = text.replace("<caret>", select),

0 commit comments

Comments
 (0)