Escape widget ids which are Kotlin keywords
This commit is contained in:
+14
-3
@@ -17,6 +17,8 @@
|
|||||||
package org.jetbrains.kotlin.lang.resolve.android
|
package org.jetbrains.kotlin.lang.resolve.android
|
||||||
|
|
||||||
import com.intellij.openapi.util.Key
|
import com.intellij.openapi.util.Key
|
||||||
|
import org.jetbrains.kotlin.lexer.JetKeywordToken
|
||||||
|
import org.jetbrains.kotlin.lexer.JetTokens
|
||||||
|
|
||||||
public object AndroidConst {
|
public object AndroidConst {
|
||||||
val ANDROID_USER_PACKAGE: Key<String> = Key.create<String>("ANDROID_USER_PACKAGE")
|
val ANDROID_USER_PACKAGE: Key<String> = Key.create<String>("ANDROID_USER_PACKAGE")
|
||||||
@@ -35,14 +37,19 @@ public object AndroidConst {
|
|||||||
val CLEAR_FUNCTION_NAME = "clearFindViewByIdCache"
|
val CLEAR_FUNCTION_NAME = "clearFindViewByIdCache"
|
||||||
|
|
||||||
val IGNORED_XML_WIDGET_TYPES = setOf("requestFocus", "merge", "tag", "check")
|
val IGNORED_XML_WIDGET_TYPES = setOf("requestFocus", "merge", "tag", "check")
|
||||||
|
|
||||||
|
val ESCAPED_IDENTIFIERS = JetTokens.KEYWORDS.getTypes()
|
||||||
|
.map { it as? JetKeywordToken }.filterNotNull().map { it.getValue() }.toSet()
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun nameToIdDeclaration(name: String): String = AndroidConst.ID_DECLARATION_PREFIX + name
|
public fun nameToIdDeclaration(name: String): String = AndroidConst.ID_DECLARATION_PREFIX + name
|
||||||
|
|
||||||
public fun idToName(id: String): String? {
|
public fun idToName(id: String): String? {
|
||||||
return if (isResourceIdDeclaration(id)) id.replace(AndroidConst.ID_DECLARATION_PREFIX, "")
|
val unescaped =
|
||||||
else if (isResourceIdUsage(id)) id.replace(AndroidConst.ID_USAGE_PREFIX, "")
|
if (isResourceIdDeclaration(id)) id.replace(AndroidConst.ID_DECLARATION_PREFIX, "")
|
||||||
else null
|
else if (isResourceIdUsage(id)) id.replace(AndroidConst.ID_USAGE_PREFIX, "")
|
||||||
|
else null
|
||||||
|
return if (unescaped != null) escapeWidgetId(unescaped) else null
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun isResourceIdDeclaration(str: String?): Boolean = str?.startsWith(AndroidConst.ID_DECLARATION_PREFIX) ?: false
|
public fun isResourceIdDeclaration(str: String?): Boolean = str?.startsWith(AndroidConst.ID_DECLARATION_PREFIX) ?: false
|
||||||
@@ -58,4 +65,8 @@ public fun isWidgetTypeIgnored(xmlType: String): Boolean {
|
|||||||
public fun getRealWidgetType(xmlType: String): String = when (xmlType) {
|
public fun getRealWidgetType(xmlType: String): String = when (xmlType) {
|
||||||
"fragment", "include" -> "View"
|
"fragment", "include" -> "View"
|
||||||
else -> xmlType
|
else -> xmlType
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun escapeWidgetId(id: String): String {
|
||||||
|
return if (id in AndroidConst.ESCAPED_IDENTIFIERS) "`$id`" else id
|
||||||
}
|
}
|
||||||
+6
@@ -18,3 +18,9 @@ val Activity.fragmentTag: ft<View, View?>
|
|||||||
val Fragment.fragmentTag: ft<View, View?>
|
val Fragment.fragmentTag: ft<View, View?>
|
||||||
get() = getView().findViewById(0) : View
|
get() = getView().findViewById(0) : View
|
||||||
|
|
||||||
|
val Activity.`fun`: ft<TextView, TextView?>
|
||||||
|
get() = findViewById(0) as TextView
|
||||||
|
|
||||||
|
val Fragment.`fun`: ft<TextView, TextView?>
|
||||||
|
get() = getView().findViewById(0) as TextView
|
||||||
|
|
||||||
|
|||||||
+3
@@ -12,3 +12,6 @@ val View.includeTag: ft<View, View?>
|
|||||||
val View.fragmentTag: ft<View, View?>
|
val View.fragmentTag: ft<View, View?>
|
||||||
get() = findViewById(0) : View
|
get() = findViewById(0) : View
|
||||||
|
|
||||||
|
val View.`fun`: ft<TextView, TextView?>
|
||||||
|
get() = findViewById(0) as TextView
|
||||||
|
|
||||||
|
|||||||
+5
@@ -16,4 +16,9 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_width="wrap_content" />
|
android:layout_width="wrap_content" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/fun"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
||||||
Reference in New Issue
Block a user