From 6cdd9c02833b69cb8cdd007ef442bbeeb533f4e5 Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Tue, 17 Nov 2020 00:13:53 +0300 Subject: [PATCH] resolve: highlight missing namespaces --- src/clojure-constants.kt | 4 +- src/lang/clojure-inspections.kt | 27 +++++++----- src/lang/clojure-psi-fileimpl.kt | 52 ++++++++++++---------- src/lang/clojure-psi-genimpl.kt | 1 + src/lang/clojure-psi-index.kt | 12 +++-- src/lang/clojure-psi-stubs.kt | 10 ++--- src/lang/clojure-psi-symbols.kt | 28 ++++++------ testData/highlighting/ClojureFixes.clj | 2 +- testData/highlighting/ClojureScript.txt | 58 ++++++++++++++----------- 9 files changed, 107 insertions(+), 87 deletions(-) diff --git a/src/clojure-constants.kt b/src/clojure-constants.kt index b77b335..36a496a 100644 --- a/src/clojure-constants.kt +++ b/src/clojure-constants.kt @@ -72,7 +72,7 @@ object ClojureConstants { @JvmStatic val DEF_ALIKE_SYMBOLS = "\\s+".toRegex().split(""" def defn defn- defmacro defonce deftype defrecord defstruct defmulti defprotocol def-aset definline definterface - define defcurried deftype* defrecord* create-ns + define defcurried deftype* defrecord* """.trim()).toSet() @JvmStatic val FN_ALIKE_SYMBOLS = "\\s+".toRegex().split("""fn fn* rfn""").toSet() @@ -85,7 +85,7 @@ object ClojureConstants { """.trim()).toSet() @JvmStatic val NS_ALIKE_SYMBOLS = "\\s+".toRegex().split(""" - ns in-ns import require require-macros use refer refer-clojure alias + ns in-ns create-ns import require require-macros use refer refer-clojure alias """.trim()).toSet() @JvmStatic val TYPE_META_ALIASES = "\\s+".toRegex().split(""" diff --git a/src/lang/clojure-inspections.kt b/src/lang/clojure-inspections.kt index fb9ef2f..0c0f616 100644 --- a/src/lang/clojure-inspections.kt +++ b/src/lang/clojure-inspections.kt @@ -24,13 +24,9 @@ import com.intellij.psi.PsiPolyVariantReference import org.intellij.clojure.ClojureConstants import org.intellij.clojure.ClojureConstants.SYMBOLIC_VALUES import org.intellij.clojure.psi.* -import org.intellij.clojure.psi.impl.CFileImpl -import org.intellij.clojure.psi.impl.placeLanguage +import org.intellij.clojure.psi.impl.* import org.intellij.clojure.tools.Tool -import org.intellij.clojure.util.elementType -import org.intellij.clojure.util.iterate -import org.intellij.clojure.util.jbIt -import org.intellij.clojure.util.parents +import org.intellij.clojure.util.* import kotlin.collections.component1 import kotlin.collections.component2 @@ -62,9 +58,13 @@ class ClojureResolveInspection : LocalInspectionTool() { override fun visitSymbol(o: CSymbol) { val reference = o.reference val multiResolve = (reference as PsiPolyVariantReference).multiResolve(false) - val (valid, invalid) = multiResolve.jbIt().reduce(arrayOf(0, 0)) { arr, it -> arr[if (it.isValidResult) 0 else 1] ++; arr } if (o.getUserData(RESOLVE_SKIPPED) != null) return + val checkBadNS = { it : PsiElement? -> o.parent !is CSymbol && + it.asCTarget?.key?.run { type == "ns" && namespace == "" } == true && + it.forceXTarget.let { it != null && !it.canNavigate() }} + val (valid, invalid, badNS) = multiResolve.jbIt().reduce(arrayOf(0, 0, 0)) { arr, it -> arr[if (it.isValidResult) if (checkBadNS(it.element)) 2 else 0 else 1] ++; arr } + val qualifier = reference.qualifier?.apply { if (this.reference?.resolve() == null) return } @@ -77,8 +77,10 @@ class ClojureResolveInspection : LocalInspectionTool() { if (o.parent is CSymbol && o.parent.parent is CKeyword && o.parent.prevSibling?.elementType == ClojureTypes.C_COLON) return val quotesAndComments = o.parents().filter { - it is CMetadata || it is CForm && (it.flags and FLAG_COMMENTED != 0 || - it.role != Role.RCOND && it.iterate(CReaderMacro::class).find { suppressResolve(it, invalid != 0) } != null) + it is CMetadata || + it.fastFlagIsSet(FLAG_COMMENTED) || + it is CReaderMacro && it.firstChild.elementType == ClojureTypes.C_SHARP_NS || + it.role != Role.RCOND && it.iterate(CReaderMacro::class).find { suppressResolve(it, invalid != 0, badNS != 0) } != null }.first() if (quotesAndComments != null) return holder.registerProblem(reference, "unable to resolve '${reference.referenceName}'", ProblemHighlightType.GENERIC_ERROR_OR_WARNING) @@ -87,9 +89,10 @@ class ClojureResolveInspection : LocalInspectionTool() { } } -private fun suppressResolve(o: CReaderMacro, invalidResolve: Boolean) = when (o.firstChild.elementType) { - ClojureTypes.C_QUOTE, ClojureTypes.C_SYNTAX_QUOTE -> true - ClojureTypes.C_SHARP_QUOTE -> invalidResolve +private fun suppressResolve(o: CReaderMacro, invalid: Boolean, badNS : Boolean) = when (o.firstChild.elementType) { + ClojureTypes.C_QUOTE -> !badNS + ClojureTypes.C_SYNTAX_QUOTE -> true + ClojureTypes.C_SHARP_QUOTE -> invalid || badNS ClojureTypes.C_SHARP_SYM -> SYMBOLIC_VALUES.contains((o.parent as? CSymbol)?.name) else -> false } diff --git a/src/lang/clojure-psi-fileimpl.kt b/src/lang/clojure-psi-fileimpl.kt index e54367d..84c20ea 100644 --- a/src/lang/clojure-psi-fileimpl.kt +++ b/src/lang/clojure-psi-fileimpl.kt @@ -65,7 +65,7 @@ open class CFileImpl(viewProvider: FileViewProvider, language: Language) : else -> fileStubForced } } - internal val fileStubForced: CFileStub? + internal val fileStubForced: CFileStub get() = fileStubRef?.get() ?: run { val stub = if (virtualFile !is VirtualFileWithId) buildStubTree(this) else StubTreeLoader.getInstance().readFromVFile(project, virtualFile)?.root as? CFileStub ?: buildStubTree(this) @@ -110,7 +110,7 @@ open class CFileImpl(viewProvider: FileViewProvider, language: Language) : val helper = RoleHelper() helper.assignRoles(this, curState != null && curState.timeStamp < 0) val definitions = cljTraverser().traverse() - .filter { (it as? CComposite)?.roleImpl == Role.DEF } + .filter { (it as? CComposite)?.dataImpl is IDef } .filter(CList::class).toList() val state = State(curTimeStamp, helper.fileNS, definitions, helper.imports) myState = state @@ -343,7 +343,7 @@ private fun processSyntheticDeclarations(def: IDef, private: Boolean, private class RoleHelper { val langStack = ArrayDeque() val nsReader = NSReader(this) - val fileNS: String get() = nsReader.fileNS + val fileNS: String get() = nsReader.fileNS ?: ClojureConstants.NS_USER val imports: List get() = nsReader.result fun currentLangKind() = langStack.peek()!! @@ -362,7 +362,7 @@ private class RoleHelper { langStack.push(if (file.language == ClojureScriptLanguage) Dialect.CLJS else Dialect.CLJ) val s = file.cljTraverser().expand { - it !is CListBase || (it as CComposite).roleImpl != Role.DEF && (it as CComposite).roleImpl != Role.NS + it !is CListBase || (it as CComposite).roleImpl.let { r -> r != Role.DEF && r != Role.NS } }.traverse() if (firstTime) { @@ -396,14 +396,13 @@ private class RoleHelper { val ns = first.qualifier?.name?.let { resolveAlias(it) } ?: if (seenDefs.contains(firstName.withNamespace(fileNS))) fileNS else langKind.coreNs setData(first.qualifier, ns) + val nameSym = (first.nextForm as? CSymbol)?.apply { initFlags(this) } if (ClojureConstants.DEF_ALIKE_SYMBOLS.contains(firstName) && ns == langKind.coreNs || firstName != "defmethod" && firstName.startsWith("def") && firstName != "default" && firstName != "def" /* clojure.spec/def */) { - val nameSym = first.nextForm as? CSymbol - if (nameSym != null && nameSym.firstChild !is CReaderMacro ) { + if (nameSym != null && !nameSym.fastFlagIsSet(FLAG_QUOTED) && !nameSym.fastFlagIsSet(FLAG_UNQUOTED)) { // optimization: delay up until the end, so that other threads may skip this - val type = if (firstName == "create-ns") "ns" else firstName - val key = SymKey(nameSym.name, resolveAlias(nameSym.qualifier?.name) ?: fileNS, type) + val key = SymKey(nameSym.name, resolveAlias(nameSym.qualifier?.name) ?: fileNS, firstName) setData(nameSym.qualifier, key.namespace) setData(nameSym, Role.NAME) delayedDefs[e] = createDef(e, nameSym, key) @@ -429,7 +428,6 @@ private class RoleHelper { seenDefs.add(key.name) } else if (ClojureConstants.NS_ALIKE_SYMBOLS.contains(firstName) && ns == langKind.coreNs) { - setData(e, Role.NS) // prevents deep traversal for e processNSElement(e) } else if (ClojureConstants.LET_ALIKE_SYMBOLS.contains(firstName) && ns == langKind.coreNs) { @@ -566,23 +564,26 @@ private class RoleHelper { } private class NSReader(val helper: RoleHelper) { - var fileNS: String = ClojureConstants.NS_USER + var fileNS: String? = null val result = mutableListOf() fun processElement(e: CListBase) { val nsType = (e as CList).first!!.name var imports: MutableList? = null - if (nsType == "in-ns" || nsType == "ns") { - val nameSym = e.first.nextForm as? CSymbol + val nameSym = e.first.nextForm as? CSymbol + val nsName = nameSym?.name + val nsQuotedOK = (nsType == "ns") != nameSym.fastFlagIsSet(FLAG_QUOTED) + if (nsName != null && nsQuotedOK && (nsType == "ns" || nsType == "create-ns" || nsType == "in-ns")) { imports = mutableListOf() - if (nameSym != null) { - val name = nameSym.name - setData(nameSym, Role.NAME) - setData(e, NSDef(SymKey(name, "", "ns"), imports)) - if (result.isEmpty()) { - fileNS = name - } + setData(nameSym, Role.NAME) + setData(e, NSDef(SymKey(nsName, "", "ns"), imports)) + if (fileNS == null && nsType != "create-ns" && e.parentForm == null) { + fileNS = nsName } + if (nsType != "ns") return + } + else { + setData(e, Role.NS) } val hasRC = e.cljTraverser().filter(CListBase::class.java) .reduce(false, { flag, it -> helper.processRCParenForm(it) || flag }) @@ -618,7 +619,8 @@ private class NSReader(val helper: RoleHelper) { } if (imports.isEmpty()) return null val scope = e.parentForms.skip(1).filter { it.fastRole != Role.RCOND && it.fastRole != Role.RCOND_S }.first() - return Imports(imports, dialect, e.textRange, scope?.textRange?.endOffset ?: -1) + val range = TextRange(e.first!!.textRange.endOffset, e.textRange.endOffset) + return Imports(imports, dialect, range, scope?.textRange?.endOffset ?: -1) } fun readNSElement2(root: CListBase, traverser: SyntaxTraverser, nsType: String, inNs: Boolean, dialect: Dialect): List { @@ -666,8 +668,8 @@ private class NSReader(val helper: RoleHelper) { val iterator = content.iterator() val aliasSym = iterator.safeNext() as? CSymbol ?: return emptyList() val nsSym = iterator.safeNext() as? CSymbol - val aliasQuoted = aliasSym.fastFlags and FLAG_QUOTED != 0 - val nsQuoted = nsSym.fastFlags and FLAG_QUOTED != 0 + val aliasQuoted = aliasSym.fastFlagIsSet(FLAG_QUOTED) + val nsQuoted = nsSym.fastFlagIsSet(FLAG_QUOTED) val namespace = if (nsQuoted) nsSym?.name ?: "" else "" if (aliasQuoted) { setResolveTo(aliasSym, SymKey(aliasSym.name, namespace, "alias")) @@ -731,8 +733,10 @@ private class NSReader(val helper: RoleHelper) { for (item in iterator) { when (item) { is CKeyword -> if (item.name == "as") iterator.safeNext() // ignore the next form to get it highlighted - is CSymbol -> addImport(item, "") - is CLVForm -> if (inNs == (item.fastFlags and FLAG_QUOTED == 0)) { + is CSymbol -> if (inNs != item.fastFlagIsSet(FLAG_QUOTED)) { + addImport(item, "") + } + is CLVForm -> if (inNs != item.fastFlagIsSet(FLAG_QUOTED)) { if (item is CVec && (item.childForm(CKeyword::class) != null || item.childForm(CLVForm::class) == null)) { addImport(item, "") } diff --git a/src/lang/clojure-psi-genimpl.kt b/src/lang/clojure-psi-genimpl.kt index 41608d0..1df595c 100644 --- a/src/lang/clojure-psi-genimpl.kt +++ b/src/lang/clojure-psi-genimpl.kt @@ -143,6 +143,7 @@ fun newLeafPsiElement(project: Project, s: String): PsiElement = val PsiElement?.fastRole: Role get() = (this as? CComposite)?.roleImpl ?: Role.NONE val PsiElement?.fastFlags: Int get() = (this as? CComposite)?.flagsImpl ?: 0 +fun PsiElement?.fastFlagIsSet(flag: Int): Boolean = fastFlags and flag == flag val CList?.fastDef: IDef? get() = (this as? CListBase)?.run { ((this as CComposite).dataImpl as? IDef)?.run { diff --git a/src/lang/clojure-psi-index.kt b/src/lang/clojure-psi-index.kt index b49fc02..6ce0f97 100644 --- a/src/lang/clojure-psi-index.kt +++ b/src/lang/clojure-psi-index.kt @@ -32,7 +32,7 @@ import java.io.DataOutput /** * @author gregsh */ -val VERSION = 202 +val VERSION = 204 val NS_INDEX = ID.create("clojure.ns") val DEF_INDEX = ID.create("clojure.def") @@ -43,21 +43,25 @@ val KEYWORD_FQN_INDEX = ID.create("clojure.keyword.fqn") class ClojureNSIndex : ClojureUnitIndex() { override fun getName(): ID = NS_INDEX override fun index(file: CFile): MutableMap { - return mutableMapOf(file.namespace to Unit) + val result = mutableMapOf(file.namespace to Unit) + file.defs().filter { it.def!!.type == "ns" }.forEach { + result[it.def!!.name] = Unit + } + return result } } class ClojureDefIndex : ClojureUnitIndex() { override fun getName(): ID = DEF_INDEX override fun index(file: CFile): MutableMap { - return file.defs().map { it.def!!.name }.toMap { Unit } + return file.defs().filter { it.def!!.type != "ns" }. map { it.def!!.name }.toMap { Unit } } } class ClojureDefFqnIndex : ClojureUnitIndex() { override fun getName(): ID = DEF_FQN_INDEX override fun index(file: CFile): MutableMap { - return file.defs().map {it.def!!.qualifiedName }.toMap { Unit } + return file.defs().filter { it.def!!.type != "ns" }.map { it.def!!.qualifiedName }.toMap { Unit } } } diff --git a/src/lang/clojure-psi-stubs.kt b/src/lang/clojure-psi-stubs.kt index d140f9c..48986cb 100644 --- a/src/lang/clojure-psi-stubs.kt +++ b/src/lang/clojure-psi-stubs.kt @@ -37,7 +37,7 @@ import kotlin.reflect.jvm.internal.impl.utils.SmartList /** * @author gregsh */ -private val VERSION: Int = 6 +val VERSION: Int = 7 class ClojureStubBuilder : BinaryFileStubBuilder { override fun getStubVersion() = VERSION @@ -106,7 +106,7 @@ class CListStub(val key: SymKey, ?.registerListStub(this) } - override fun getStubType() = SERIALIZER as ObjectStubSerializer<*, Stub> + override fun getStubType() = SERIALIZER override fun toString() = key.toString() companion object { @@ -127,7 +127,7 @@ class CListStub(val key: SymKey, class CPrototypeStub(val args: List, val typeHint: String?, parent: CStub?) : CStub(parent) { - override fun getStubType() = SERIALIZER as ObjectStubSerializer<*, Stub> + override fun getStubType() = SERIALIZER override fun toString() = args.toString() companion object { @@ -154,7 +154,7 @@ class CPrototypeStub(val args: List, val typeHint: String?, parent: CStub?) class CMetaStub(val map: Map, parent: CStub?) : CStub(parent) { - override fun getStubType() = SERIALIZER as ObjectStubSerializer<*, Stub> + override fun getStubType() = SERIALIZER override fun toString() = map.toString() companion object { @@ -169,7 +169,7 @@ class CMetaStub(val map: Map, parent: CStub?) : CStub(parent) { } internal class CImportStub(val import: Import, val dialect: Dialect, parent: CStub?) : CStub(parent) { - override fun getStubType() = SERIALIZER as ObjectStubSerializer<*, Stub> + override fun getStubType() = SERIALIZER companion object { val SERIALIZER = object : ObjectStubSerializer { diff --git a/src/lang/clojure-psi-symbols.kt b/src/lang/clojure-psi-symbols.kt index 30cca6d..e9adb98 100644 --- a/src/lang/clojure-psi-symbols.kt +++ b/src/lang/clojure-psi-symbols.kt @@ -286,25 +286,25 @@ private fun wrapWithNavigationElement(project: Project, key: SymKey): PsiElement internal fun wrapWithNavigationElement(project: Project, key: SymKey, file: VirtualFile?): NavigatablePsiElement { val adjusted = key.adjustKeyForNavigation() fun locate(k: SymKey, clazz: KClass): (CFile) -> Navigatable? = { f -> - f.cljTraverser().traverse().filter(clazz).find { - if (k.type == "keyword") it is CKeyword && it.namespace == k.namespace - else it is CList && it.def?.run { name == k.name && namespace == k.namespace } ?: false - }.let { - when { - k == key -> it - key.type == "field" -> { - it.findChild(Role.FIELD_VEC).iterate().find { it is CSymbol && it.name == key.name } as? CSymbol - } - key.type == "method" -> { - it.childForms(CList::class).find { it?.def?.let { it.name == key.name && it.type == key.type} == true } - } - else -> it + val form = f.cljTraverser().traverse().filter(clazz).find { + when (k.type) { + "keyword" -> it is CKeyword && it.run { name == k.name && namespace == k.namespace } + else -> it is CList && it.def?.run { name == k.name && namespace == k.namespace } ?: false } } + when { + k == key -> form + key.type == "field" -> { + form.findChild(Role.FIELD_VEC).iterate().find { form is CSymbol && form.name == key.name } as? CSymbol + } + key.type == "method" -> { + form.childForms(CList::class).find { it?.def?.let { it.name == key.name && it.type == key.type } == true } + } + else -> form + } } return when (key.type) { - "ns" -> CPomTargetElement(project, XTarget(project, key, file) { it }) "keyword" -> CPomTargetElement(project, XTarget(project, key, file, locate(adjusted, CKeywordBase::class))) else -> CPomTargetElement(project, XTarget(project, key, file, locate(adjusted, CListBase::class))) } diff --git a/testData/highlighting/ClojureFixes.clj b/testData/highlighting/ClojureFixes.clj index 868b1d8..1870425 100644 --- a/testData/highlighting/ClojureFixes.clj +++ b/testData/highlighting/ClojureFixes.clj @@ -49,7 +49,7 @@ ) (do (ns nsns (:require [clojure.core])) - (require '[clojure.missing])) + (require '[clojure.missing])) (do (use '[clojure.set :as s1]) diff --git a/testData/highlighting/ClojureScript.txt b/testData/highlighting/ClojureScript.txt index 5e255a4..3358d50 100644 --- a/testData/highlighting/ClojureScript.txt +++ b/testData/highlighting/ClojureScript.txt @@ -7,7 +7,7 @@ cognitect/transit.clj 0 errors, 5 warnings, 3 dynamic 13717: dynamic 'x' 13724: dynamic 'y' 13791: dynamic 'r' -cljs/analyzer.cljc 0 errors, 7 warnings, 10 dynamic, 47 ignored +cljs/analyzer.cljc 0 errors, 7 warnings, 12 dynamic, 48 ignored 604: unable to resolve 'ensure' 149016: unable to resolve 'info' 149193: unable to resolve 'info' @@ -22,6 +22,8 @@ cljs/analyzer.cljc 0 errors, 7 warnings, 10 dynamic, 47 ig 52264: dynamic 'cljs$lang$test' 150611: dynamic 'contains' 152345: dynamic 'isMacro' + 152715: dynamic 'sym' + 153298: dynamic 'sym' 156155: dynamic 'charAt' 156461: dynamic 'charAt' 156490: dynamic '-length' @@ -34,7 +36,8 @@ cljs/cli.clj 0 errors, 0 warnings, 3 dynamic 3124: dynamic 'length' 11602: dynamic 'exists' 12525: dynamic 'exists' -cljs/closure.clj 0 errors, 0 warnings, 40 dynamic +cljs/closure.clj 0 errors, 1 warnings, 40 dynamic + 145194: unable to resolve 'goog.events' 2873: dynamic 'getCanonicalPath' 16606: dynamic 'setOptionsForCompilationLevel' 18132: dynamic 'getFile' @@ -75,7 +78,7 @@ cljs/closure.clj 0 errors, 0 warnings, 40 dynamic 142458: dynamic 'watchable' 146668: dynamic 'isFile' 146687: dynamic 'delete' -cljs/compiler.cljc 0 errors, 1 warnings, 8 dynamic, 49 ignored +cljs/compiler.cljc 0 errors, 1 warnings, 8 dynamic, 50 ignored 604: unable to resolve 'ensure' 1909: dynamic 'StringBuffer' 5833: dynamic 'toString' @@ -136,7 +139,7 @@ cljs/core.cljc 0 errors, 7 warnings, 41 dynamic, 23 ig 137090: dynamic 'slice' 141847: dynamic '-cljs$lang$macro' 143846: dynamic '-cljs$lang$macro' -cljs/core.cljs 0 errors, 10 warnings, 621 dynamic, 362 ignored +cljs/core.cljs 0 errors, 10 warnings, 623 dynamic, 368 ignored 33056: unable to resolve 'cljs.core.Var' 104285: unable to resolve 'apply-to' 104609: unable to resolve 'apply-to' @@ -196,6 +199,7 @@ cljs/core.cljs 0 errors, 10 warnings, 621 dynamic, 362 33410: dynamic 'substring' 33470: dynamic 'substring' 33503: dynamic '-length' + 33540: dynamic 'sym' 33585: dynamic 'fqn' 33882: dynamic '-cljs$lang$macro' 36766: dynamic 'length' @@ -704,6 +708,7 @@ cljs/core.cljs 0 errors, 10 warnings, 621 dynamic, 362 286256: dynamic 'append' 292757: dynamic 'state' 292921: dynamic 'state' + 293049: dynamic 'sym' 294365: dynamic 'meta' 294388: dynamic 'meta' 294495: dynamic 'meta' @@ -773,7 +778,8 @@ cljs/core/server.clj 0 errors, 3 warnings, 0 dynamic 527: unable to resolve 'resolve-fn' 538: unable to resolve 'prepl' 544: unable to resolve 'io-prepl' -cljs/core/specs/alpha.cljc 0 errors, 1 warnings, 0 dynamic +cljs/core/specs/alpha.cljc 0 errors, 2 warnings, 0 dynamic + 593: unable to resolve 'cljs.core$macros' 6567: unable to resolve 'ns-special-form' cljs/core/specs/alpha.cljs 0 errors, 0 warnings, 0 dynamic cljs/env.cljc 0 errors, 0 warnings, 0 dynamic @@ -802,7 +808,7 @@ cljs/externs.clj 0 errors, 0 warnings, 22 dynamic 10389: dynamic 'getName' 10592: dynamic 'getName' cljs/js.clj 0 errors, 0 warnings, 0 dynamic -cljs/js.cljs 0 errors, 12 warnings, 33 dynamic, 15 ignored +cljs/js.cljs 0 errors, 12 warnings, 33 dynamic, 16 ignored 4412: unable to resolve 'default-compiler-env' 9423: unable to resolve 'default-compiler-env' 25887: unable to resolve '*compiler*' @@ -849,7 +855,7 @@ cljs/js.cljs 0 errors, 12 warnings, 33 dynamic, 15 i 61779: dynamic '-cause' 61786: dynamic '-stack' cljs/js_deps.cljc 0 errors, 0 warnings, 0 dynamic, 2 ignored -cljs/loader.cljs 0 errors, 0 warnings, 16 dynamic, 10 ignored +cljs/loader.cljs 0 errors, 0 warnings, 16 dynamic, 12 ignored 592: dynamic 'ModuleLoader' 630: dynamic 'ModuleManager' 1094: dynamic 'legacy/trustedResourceUrlFromString' @@ -873,9 +879,9 @@ cljs/nodejs.cljs 0 errors, 0 warnings, 4 dynamic, 4 igno 924: dynamic 'log' 1018: dynamic 'apply' 1027: dynamic 'error' -cljs/nodejscli.cljs 0 errors, 0 warnings, 0 dynamic, 9 ignored +cljs/nodejscli.cljs 0 errors, 0 warnings, 0 dynamic, 10 ignored cljs/pprint.cljc 0 errors, 0 warnings, 0 dynamic -cljs/pprint.cljs 0 errors, 44 warnings, 42 dynamic, 117 ignored +cljs/pprint.cljs 0 errors, 45 warnings, 42 dynamic, 118 ignored 11722: unable to resolve 'nl-t?' 12077: unable to resolve 'nl-t?' 12869: unable to resolve 'nl-t?' @@ -909,6 +915,7 @@ cljs/pprint.cljs 0 errors, 44 warnings, 42 dynamic, 117 92756: unable to resolve 'params' 92826: unable to resolve 'params' 92898: unable to resolve 'params' + 97952: unable to resolve 'directive-table' 109099: unable to resolve 'aseq' 109128: unable to resolve 'aseq' 109159: unable to resolve 'aseq' @@ -963,7 +970,7 @@ cljs/pprint.cljs 0 errors, 44 warnings, 42 dynamic, 117 125017: dynamic 'col_write' 125349: dynamic 'col_write' cljs/reader.clj 0 errors, 0 warnings, 0 dynamic -cljs/reader.cljs 0 errors, 1 warnings, 6 dynamic, 18 ignored +cljs/reader.cljs 0 errors, 1 warnings, 6 dynamic, 19 ignored 3859: unable to resolve 'PersistentQueue.EMPTY' 691: dynamic 'StringBuffer' 895: dynamic 'getLength' @@ -983,7 +990,7 @@ cljs/repl.cljc 0 errors, 0 warnings, 11 dynamic, 9 ign 52607: dynamic 'instanceMethod' 52656: dynamic 'instanceField' 64988: dynamic 'stack' -cljs/repl.cljs 0 errors, 0 warnings, 1 dynamic, 6 ignored +cljs/repl.cljs 0 errors, 0 warnings, 1 dynamic, 8 ignored 2861: dynamic 'name' cljs/repl/bootstrap.clj 0 errors, 0 warnings, 11 dynamic 966: dynamic 'isProvided__' @@ -1041,7 +1048,7 @@ cljs/repl/server.clj 0 errors, 0 warnings, 19 dynamic cljs/server/browser.clj 0 errors, 0 warnings, 0 dynamic cljs/server/node.clj 0 errors, 0 warnings, 0 dynamic cljs/source_map.clj 0 errors, 0 warnings, 0 dynamic -cljs/source_map.cljs 0 errors, 0 warnings, 2 dynamic, 25 ignored +cljs/source_map.cljs 0 errors, 0 warnings, 2 dynamic, 26 ignored 9497: dynamic 'valueOf' 10303: dynamic 'stringify' cljs/source_map/base64.clj 0 errors, 0 warnings, 0 dynamic @@ -1056,7 +1063,7 @@ cljs/source_map/base64_vlq.cljs 0 errors, 0 warnings, 6 dynamic, 2 igno 2221: dynamic 'substring' cljs/spec/alpha.cljc 0 errors, 1 warnings, 0 dynamic 1607: unable to resolve 'str' -cljs/spec/alpha.cljs 0 errors, 40 warnings, 6 dynamic, 13 ignored +cljs/spec/alpha.cljs 0 errors, 40 warnings, 7 dynamic, 14 ignored 8791: unable to resolve 'such-that' 10432: unable to resolve 'map-spec' 12523: unable to resolve 'return' @@ -1098,6 +1105,7 @@ cljs/spec/alpha.cljs 0 errors, 40 warnings, 6 dynamic, 13 ig 51688: unable to resolve 'return' 52244: unable to resolve 'sample' 4503: dynamic 'name' + 10273: dynamic 'sym' 49073: dynamic 'message' 52729: dynamic 'lessThanOrEqual' 52769: dynamic 'lessThan' @@ -1221,7 +1229,7 @@ cljs/spec/gen/alpha.cljs 0 errors, 112 warnings, 1 dynamic, 2 ig cljs/spec/test/alpha.cljc 0 errors, 2 warnings, 0 dynamic 2191: unable to resolve 'cljs.spec.alpha$macros' 8356: unable to resolve 'cljs.spec.alpha$macros' -cljs/spec/test/alpha.cljs 0 errors, 0 warnings, 12 dynamic, 8 ignored +cljs/spec/test/alpha.cljs 0 errors, 0 warnings, 12 dynamic, 10 ignored 1578: dynamic '-location' 1588: dynamic '-host' 1620: dynamic '-location' @@ -1234,7 +1242,7 @@ cljs/spec/test/alpha.cljs 0 errors, 0 warnings, 12 dynamic, 8 ign 3979: dynamic 'cljs$core$IFn$_invoke$arity$variadic' 4561: dynamic 'cljs$core$IFn$_invoke$arity$variadic' 4619: dynamic 'cljs$core$IFn$_invoke$arity$variadic' -cljs/stacktrace.cljc 0 errors, 0 warnings, 4 dynamic, 11 ignored +cljs/stacktrace.cljc 0 errors, 0 warnings, 4 dynamic, 12 ignored 12911: dynamic 'indexOf' 12949: dynamic 'indexOf' 12976: dynamic 'substring' @@ -1262,12 +1270,12 @@ cljs/util.cljc 0 errors, 1 warnings, 5 dynamic 5596: dynamic 'getFile' 6926: dynamic 'getAbsolutePath' 6981: dynamic 'getFile' -clojure/browser/dom.cljs 0 errors, 0 warnings, 4 dynamic, 49 ignored +clojure/browser/dom.cljs 0 errors, 0 warnings, 4 dynamic, 51 ignored 759: dynamic 'log' 821: dynamic 'log' 4239: dynamic 'value' 4581: dynamic 'click' -clojure/browser/event.cljs 0 errors, 0 warnings, 11 dynamic, 4 ignored +clojure/browser/event.cljs 0 errors, 0 warnings, 11 dynamic, 5 ignored 717: dynamic 'EventTarget' 729: dynamic 'EventType' 937: dynamic 'toLowerCase' @@ -1279,7 +1287,7 @@ clojure/browser/event.cljs 0 errors, 0 warnings, 11 dynamic, 4 ign 2117: dynamic 'events/dispatchEvent' 2171: dynamic 'events/expose' 2273: dynamic 'events/getTotalListenerCount' -clojure/browser/net.cljs 0 errors, 1 warnings, 22 dynamic, 15 ignored +clojure/browser/net.cljs 0 errors, 1 warnings, 22 dynamic, 17 ignored 4870: unable to resolve 'WebSocket.EventType' 807: dynamic 'XhrIo' 813: dynamic 'EventType' @@ -1303,7 +1311,7 @@ clojure/browser/net.cljs 0 errors, 1 warnings, 22 dynamic, 15 ig 4575: dynamic 'open' 4635: dynamic 'send' 4806: dynamic 'toLowerCase' -clojure/browser/repl.cljs 0 errors, 2 warnings, 33 dynamic, 95 ignored +clojure/browser/repl.cljs 0 errors, 2 warnings, 33 dynamic, 100 ignored 1368: unable to resolve 'HOST' 1399: unable to resolve 'PORT' 1772: dynamic 'json/serialize' @@ -1354,7 +1362,7 @@ clojure/reflect.cljs 0 errors, 0 warnings, 3 dynamic, 3 igno 1169: dynamic 'getResponseText' 1188: dynamic 'currentTarget' clojure/set.cljs 0 errors, 0 warnings, 0 dynamic -clojure/string.cljs 0 errors, 0 warnings, 31 dynamic, 37 ignored +clojure/string.cljs 0 errors, 0 warnings, 31 dynamic, 38 ignored 592: dynamic 'StringBuffer' 838: dynamic 'replace' 984: dynamic 'source' @@ -1392,7 +1400,7 @@ process/env.cljs 0 errors, 1 warnings, 0 dynamic 541: unable to resolve 'NODE_ENV' clojure/data/json.clj 0 errors, 0 warnings, 0 dynamic clojure/data/json_compat_0_1.clj 0 errors, 0 warnings, 0 dynamic -cljs/tools/reader.cljs 0 errors, 8 warnings, 25 dynamic, 40 ignored +cljs/tools/reader.cljs 0 errors, 8 warnings, 25 dynamic, 42 ignored 594: unable to resolve 'read' 599: unable to resolve 'read-line' 609: unable to resolve 'read-string' @@ -1426,7 +1434,7 @@ cljs/tools/reader.cljs 0 errors, 8 warnings, 25 dynamic, 40 ig 33692: dynamic 'trim' 33800: dynamic 'frames' 33918: dynamic 'trim' -cljs/tools/reader/edn.cljs 0 errors, 6 warnings, 15 dynamic, 17 ignored +cljs/tools/reader/edn.cljs 0 errors, 6 warnings, 15 dynamic, 18 ignored 595: unable to resolve 'read' 600: unable to resolve 'read-string' 617: unable to resolve 'default-data-readers' @@ -1460,11 +1468,11 @@ cljs/tools/reader/impl/inspect.cljs 0 errors, 0 warnings, 3 dynamic 1282: dynamic 'length' 1336: dynamic 'substring' 1368: dynamic 'length' -cljs/tools/reader/impl/utils.cljs 0 errors, 1 warnings, 1 dynamic, 7 ignored +cljs/tools/reader/impl/utils.cljs 0 errors, 1 warnings, 1 dynamic, 8 ignored 728: unable to resolve 'cljs.core.ExceptionInfo' 1532: dynamic 'test' cljs/tools/reader/reader_types.clj 0 errors, 0 warnings, 0 dynamic -cljs/tools/reader/reader_types.cljs 0 errors, 1 warnings, 13 dynamic, 3 ignored +cljs/tools/reader/reader_types.cljs 0 errors, 1 warnings, 13 dynamic, 4 ignored 634: unable to resolve 'read-line' 1910: dynamic 'charAt' 2029: dynamic 'charAt' @@ -1513,4 +1521,4 @@ clojure/tools/reader/impl/utils.clj 0 errors, 6 warnings, 0 dynamic 2360: unable to resolve 'clojure.tools.reader.impl.utils.ReaderConditional' 2455: unable to resolve 'clojure.tools.reader.impl.utils.ReaderConditional' clojure/tools/reader/reader_types.clj 0 errors, 0 warnings, 0 dynamic -Total: 281 warnings, 1141 dynamic, 1024 ignored in 93 files (1.84 MB) \ No newline at end of file +Total: 284 warnings, 1146 dynamic, 1061 ignored in 93 files (1.84 MB) \ No newline at end of file