Skip to content

Commit b8b8d25

Browse files
committed
fixed compatibility with non-java IDEs
1 parent 04c4126 commit b8b8d25

9 files changed

+66
-36
lines changed

resources/META-INF/hocon-java.xml

+4
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,8 @@
22
<extensions defaultExtensionNs="com.intellij">
33
<psi.referenceContributor implementation="org.jetbrains.plugins.hocon.ref.HoconJavaReferenceContributor"/>
44
</extensions>
5+
6+
<extensions defaultExtensionNs="org.jetbrains.plugins.hocon">
7+
<packageDirsEnumerator implementation="org.jetbrains.plugins.hocon.ref.JavaPackageDirsEnumerator"/>
8+
</extensions>
59
</idea-plugin>

resources/META-INF/plugin.xml

+4
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@
3232
]]>
3333
</change-notes>
3434

35+
<extensionPoints>
36+
<extensionPoint name="packageDirsEnumerator" interface="org.jetbrains.plugins.hocon.ref.PackageDirsEnumerator"/>
37+
</extensionPoints>
38+
3539
<extensions defaultExtensionNs="com.intellij">
3640
<fileType implementationClass="org.jetbrains.plugins.hocon.lang.HoconFileType"
3741
name="HOCON" language="HOCON" extensions="conf"/>

src/org/jetbrains/plugins/hocon/misc/HoconDocumentationProvider.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package misc
33

44
import com.intellij.lang.documentation.{DocumentationMarkup, DocumentationProviderEx}
55
import com.intellij.psi.{PsiElement, PsiManager}
6-
import org.apache.commons.lang3.StringEscapeUtils
6+
import org.apache.commons.lang.StringEscapeUtils
77
import org.jetbrains.plugins.hocon.psi._
88
import org.jetbrains.plugins.hocon.semantics.{ResOpts, ResolvedField}
99

@@ -51,7 +51,7 @@ class HoconDocumentationProvider extends DocumentationProviderEx {
5151
val content =
5252
if (docComments.isEmpty) ""
5353
else docComments
54-
.map(c => StringEscapeUtils.escapeHtml4(c.getText.stripPrefix("#")))
54+
.map(c => StringEscapeUtils.escapeHtml(c.getText.stripPrefix("#")))
5555
.mkString(CONTENT_START, "<br/>", CONTENT_END)
5656
definition + content
5757
}

src/org/jetbrains/plugins/hocon/psi/HoconPsiElement.scala

+5-4
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import org.jetbrains.plugins.hocon.lang.HoconFileType
2020
import org.jetbrains.plugins.hocon.lexer.{HoconLexer, HoconTokenSets, HoconTokenType}
2121
import org.jetbrains.plugins.hocon.parser.HoconElementType
2222
import org.jetbrains.plugins.hocon.parser.HoconElementType.HoconFileElementType
23-
import org.jetbrains.plugins.hocon.ref.{HKeyReference, IncludedFileReferenceSet}
23+
import org.jetbrains.plugins.hocon.ref.{HKeyReference, IncludedFileReferenceSet, PackageDirsEnumerator}
2424
import org.jetbrains.plugins.hocon.semantics._
2525

2626
import scala.annotation.tailrec
@@ -411,7 +411,8 @@ final class HQualifiedIncluded(ast: ASTNode) extends HoconPsiElement(ast) {
411411
Some(new IncludedFileReferenceSet(strVal, hs, true, false, scope))
412412
case None if !isValidUrl(strVal) =>
413413
val pfi = ProjectRootManager.getInstance(getProject).getFileIndex
414-
val fromClasspath = pfi.isInSource(vf) || pfi.isInLibraryClasses(vf)
414+
val fromClasspath = !PackageDirsEnumerator.EpName.getExtensions.isEmpty &&
415+
(pfi.isInSource(vf) || pfi.isInLibraryClasses(vf))
415416
if (fromClasspath || !absolutePath)
416417
Some(new IncludedFileReferenceSet(strVal, hs, false, fromClasspath, scope))
417418
else
@@ -733,7 +734,7 @@ final class HSubstitution(ast: ASTNode) extends HoconPsiElement(ast) with HValue
733734

734735
final class HConcatenation(ast: ASTNode) extends HoconPsiElement(ast) with HValue with HValueParent
735736

736-
sealed trait HLiteralValue extends HValue with PsiLiteral {
737+
sealed trait HLiteralValue extends HValue with PsiLiteralValue {
737738
def configValue: ConfigValue
738739
}
739740

@@ -769,7 +770,7 @@ object HNumber {
769770

770771
final class HUnquotedString(ast: ASTNode) extends HoconPsiElement(ast)
771772

772-
sealed trait HString extends HoconPsiElement with PsiLiteral with ContributedReferenceHost {
773+
sealed trait HString extends HoconPsiElement with PsiLiteralValue with ContributedReferenceHost {
773774
def stringType: IElementType = getFirstChild.getNode.getElementType
774775

775776
def getValue: Object = stringValue
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
package org.jetbrains.plugins.hocon
22
package ref
33

4-
import com.intellij.patterns.PlatformPatterns
5-
import com.intellij.psi.{PsiReferenceContributor, PsiReferenceRegistrar}
4+
import com.intellij.patterns.{PlatformPatterns, PsiElementPattern}
5+
import com.intellij.psi.{PsiElement, PsiLiteral, PsiReferenceContributor, PsiReferenceRegistrar}
66
import org.jetbrains.plugins.hocon.psi.HString
77

8+
import scala.reflect.{ClassTag, classTag}
9+
810
class HoconJavaReferenceContributor extends PsiReferenceContributor {
11+
private def pattern[T <: PsiElement : ClassTag]: PsiElementPattern.Capture[T] =
12+
PlatformPatterns.psiElement(classTag[T].runtimeClass.asInstanceOf[Class[T]])
13+
914
override def registerReferenceProviders(registrar: PsiReferenceRegistrar): Unit = {
10-
val pattern = PlatformPatterns.psiElement(classOf[HString])
11-
registrar.registerReferenceProvider(pattern, new HStringJavaClassReferenceProvider)
15+
registrar.registerReferenceProvider(pattern[HString], new HStringJavaClassReferenceProvider)
16+
registrar.registerReferenceProvider(pattern[PsiLiteral], new HoconPropertiesReferenceProvider)
1217
}
1318
}

src/org/jetbrains/plugins/hocon/ref/HoconPropertiesReferenceProvider.scala

+10-9
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ class HoconPropertiesReferenceProvider extends PsiReferenceProvider {
2020
if (!isEnabled(element.getProject)) PsiReference.EMPTY_ARRAY
2121
else {
2222
val res = for {
23-
lit <- element.opt.collectOnly[PsiLiteral]
23+
lit <- element.opt.collectOnly[PsiLiteralValue]
2424
strValue <- lit.getValue.opt.collectOnly[String]
2525
hpath <- HoconPsiElementFactory.createPath(strValue, PsiManager.getInstance(element.getProject)).opt
2626
strPath <- hpath.fullStringPath
2727
} yield {
28-
val text = lit.getText
29-
val fullRange = ElementManipulators.getValueTextRange(lit)
28+
val text = element.getText
29+
val fullRange = ElementManipulators.getValueTextRange(element)
3030

3131
def makeRefs(off: Int, keys: List[String]): List[HoconPropertyReference] = keys match {
3232
case Nil => Nil
@@ -47,7 +47,7 @@ class HoconPropertiesReferenceProvider extends PsiReferenceProvider {
4747
val nextRef = subRefs.headOption
4848
val revIndex = nextRef.fold(0)(_.reverseIndex + 1)
4949
val keyRange = new TextRange(off, endOffset)
50-
val ref = new HoconPropertyReference(strPath, revIndex, key, lit, keyRange)
50+
val ref = new HoconPropertyReference(strPath, revIndex, key, element, lit, keyRange)
5151
ref :: subRefs
5252
}
5353

@@ -61,16 +61,17 @@ class HoconPropertyReference(
6161
fullPath: List[String],
6262
val reverseIndex: Int,
6363
key: String,
64-
lit: PsiLiteral,
64+
element: PsiElement,
65+
lit: PsiLiteralValue,
6566
range: TextRange
6667
) extends PsiReference {
6768
def getCanonicalText: String = key
68-
def getElement: PsiElement = lit
69+
def getElement: PsiElement = element
6970
def getRangeInElement: TextRange = range
7071

71-
def createContext: ToplevelCtx = lit.getContainingFile match {
72+
def createContext: ToplevelCtx = element.getContainingFile match {
7273
case hf: HoconPsiFile => ToplevelCtx(hf)
73-
case _ => ToplevelCtx(lit, ToplevelCtx.ApplicationResource)
74+
case _ => ToplevelCtx(element, ToplevelCtx.ApplicationResource)
7475
}
7576

7677
def resolve(): PsiElement = createContext
@@ -79,7 +80,7 @@ class HoconPropertyReference(
7980
.map(_.hkey).orNull
8081

8182
override def getVariants: Array[AnyRef] = {
82-
val toplevelCtx = ToplevelCtx(lit, ToplevelCtx.ApplicationResource)
83+
val toplevelCtx = ToplevelCtx(element, ToplevelCtx.ApplicationResource)
8384
val opts = ResOpts(reverse = true)
8485

8586
val variantFields = fullPath.dropRight(reverseIndex + 1) match {

src/org/jetbrains/plugins/hocon/ref/HoconReferenceContributor.scala

+4-11
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ package org.jetbrains.plugins.hocon
22
package ref
33

44
import com.intellij.patterns.{PlatformPatterns, PsiElementPattern}
5-
import com.intellij.psi.{PsiElement, PsiLiteral, PsiReferenceContributor, PsiReferenceRegistrar}
6-
import org.jetbrains.plugins.hocon.psi.{HIncludeTarget, HKeyPart}
5+
import com.intellij.psi.{PsiElement, PsiReferenceContributor, PsiReferenceRegistrar}
6+
import org.jetbrains.plugins.hocon.psi.{HIncludeTarget, HStringValue}
77

88
import scala.reflect.{ClassTag, classTag}
99

@@ -12,14 +12,7 @@ class HoconReferenceContributor extends PsiReferenceContributor {
1212
PlatformPatterns.psiElement(classTag[T].runtimeClass.asInstanceOf[Class[T]])
1313

1414
def registerReferenceProviders(registrar: PsiReferenceRegistrar): Unit = {
15-
registrar.registerReferenceProvider(
16-
pattern[HIncludeTarget],
17-
new IncludedFileReferenceProvider
18-
)
19-
registrar.registerReferenceProvider(
20-
// don't inject HOCON refs into HOCON keys or includes (hence not HString)
21-
pattern[PsiLiteral] andNot pattern[HIncludeTarget] andNot pattern[HKeyPart],
22-
new HoconPropertiesReferenceProvider
23-
)
15+
registrar.registerReferenceProvider(pattern[HIncludeTarget], new IncludedFileReferenceProvider)
16+
registrar.registerReferenceProvider(pattern[HStringValue], new HoconPropertiesReferenceProvider)
2417
}
2518
}

src/org/jetbrains/plugins/hocon/ref/IncludedFileReferenceSet.scala

+3-6
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,9 @@ object IncludedFileReferenceSet {
6969
orderEntryScope orElse moduleScope getOrElse GlobalSearchScope.EMPTY_SCOPE
7070
}
7171

72-
def classpathPackageDirs(project: Project, scope: GlobalSearchScope, pkgName: String): List[PsiFileSystemItem] = {
73-
val psiManager = PsiManager.getInstance(project)
74-
PackageIndex.getInstance(project).getDirectoriesByPackageName(pkgName, false).iterator
75-
.filter(scope.contains).flatMap(dir => Option(psiManager.findDirectory(dir)))
76-
.toList
77-
}
72+
def classpathPackageDirs(project: Project, scope: GlobalSearchScope, pkgName: String): List[PsiFileSystemItem] =
73+
PackageDirsEnumerator.EpName.getExtensionList.iterator.asScala
74+
.flatMap(_.classpathPackageDirs(project, scope, pkgName)).toList
7875
}
7976

8077
class IncludedFileReferenceSet(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.jetbrains.plugins.hocon
2+
package ref
3+
4+
import com.intellij.openapi.extensions.ExtensionPointName
5+
import com.intellij.openapi.project.Project
6+
import com.intellij.openapi.roots.PackageIndex
7+
import com.intellij.psi.search.GlobalSearchScope
8+
import com.intellij.psi.{PsiFileSystemItem, PsiManager}
9+
10+
object PackageDirsEnumerator {
11+
final val EpName: ExtensionPointName[PackageDirsEnumerator] =
12+
ExtensionPointName.create("org.jetbrains.plugins.hocon.packageDirsEnumerator")
13+
}
14+
abstract class PackageDirsEnumerator {
15+
def classpathPackageDirs(project: Project, scope: GlobalSearchScope, pkgName: String): List[PsiFileSystemItem]
16+
}
17+
18+
final class JavaPackageDirsEnumerator extends PackageDirsEnumerator {
19+
def classpathPackageDirs(project: Project, scope: GlobalSearchScope, pkgName: String): List[PsiFileSystemItem] = {
20+
val psiManager = PsiManager.getInstance(project)
21+
PackageIndex.getInstance(project).getDirectoriesByPackageName(pkgName, false).iterator
22+
.filter(scope.contains).flatMap(dir => Option(psiManager.findDirectory(dir)))
23+
.toList
24+
}
25+
}

0 commit comments

Comments
 (0)