Skip to content

Commit d57b81d

Browse files
committed
refactor(css): streamline CSS ruleset creation and enhance stylesheet resolution logic
1 parent 424649c commit d57b81d

2 files changed

Lines changed: 30 additions & 44 deletions

File tree

src/main/kotlin/com/peppa/css/annotator/SimpleCssSelectorFix.kt

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,24 +28,20 @@ class SimpleCssSelectorFix(private val key: String, private val stylesheetFile:
2828
if (editor == null || file == null) return
2929

3030
val rulesetText = "\n.$key {\n\t\t\n}"
31-
val ruleset = CssElementFactory.getInstance(project).createRuleset(
32-
rulesetText,
33-
stylesheetFile.language
34-
)
31+
val ruleset = CssElementFactory.getInstance(project).createRuleset(rulesetText, stylesheetFile.language)
3532

3633
stylesheetFile.navigate(true)
3734
stylesheetFile.add(ruleset)
38-
val newEditor = FileEditorManager.getInstance(project).selectedEditor ?: return;
39-
if (newEditor is TextEditor) {
40-
newEditor.editor.caretModel.moveToLogicalPosition(
41-
LogicalPosition(newEditor.editor.document.lineCount - 2, 0)
42-
)
43-
newEditor.editor.scrollingModel.scrollTo(
44-
newEditor.editor.caretModel.logicalPosition,
45-
ScrollType.MAKE_VISIBLE
46-
)
47-
DeclarativeInlayHintsPassFactory.scheduleRecompute(editor, project)
48-
DeclarativeInlayHintsPassFactory.scheduleRecompute(newEditor.editor, project)
35+
36+
FileEditorManager.getInstance(project).selectedEditor?.let { newEditor ->
37+
if (newEditor is TextEditor) {
38+
newEditor.editor.apply {
39+
caretModel.moveToLogicalPosition(LogicalPosition(document.lineCount - 2, 0))
40+
scrollingModel.scrollTo(caretModel.logicalPosition, ScrollType.MAKE_VISIBLE)
41+
}
42+
DeclarativeInlayHintsPassFactory.scheduleRecompute(editor, project)
43+
DeclarativeInlayHintsPassFactory.scheduleRecompute(newEditor.editor, project)
44+
}
4945
}
5046
}
5147
}

src/main/kotlin/com/peppa/css/completion/QCssModulesUtil.kt

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -165,20 +165,19 @@ fun buildLookupElementHelper(
165165
val lookupString = CssEscapeUtil.escapeSpecialCssChars(name)
166166
val lineNumber = (css as CssRuleset).selectors.first().lineNumber
167167
val lookup = if (isNeedWrapByChar) "'$lookupString'" else lookupString
168-
val ele = LookupElementBuilder.createWithSmartPointer(lookup, css)
169-
.bold()
170-
.withPsiElement(css)
171-
.withIcon(AllIcons.Xml.Css_class)
172-
.withPresentableText(lookup)
173-
.withCaseSensitivity(true)
174-
.withTailText(" ".repeat(SpaceSize) + "($location:$lineNumber)", true)
175-
176-
return PrioritizedLookupElement.withPriority(ele, CssCompletionUtil.CSS_SELECTOR_SUFFIX_PRIORITY.toDouble())
168+
return LookupElementBuilder.createWithSmartPointer(lookup, css).apply {
169+
bold()
170+
withPsiElement(css)
171+
withIcon(AllIcons.Xml.Css_class)
172+
withPresentableText(lookup)
173+
withCaseSensitivity(true)
174+
withTailText(" ".repeat(SpaceSize) + "($location:$lineNumber)", true)
175+
}.let { PrioritizedLookupElement.withPriority(it, CssCompletionUtil.CSS_SELECTOR_SUFFIX_PRIORITY.toDouble()) }
177176
}
178177

179178
private fun toGetStylesheetFile(ref: PsiReference?): StylesheetFile? {
180179
// 增强解析逻辑:支持直接 resolve 到 StylesheetFile、PsiFile,或 ES6ImportedBinding,
181-
// 并尝试沿引用链继续解析,提升命中率和鲁棒性
180+
// 并尝试沿引用链继续解析,提升命中率��鲁棒性
182181
val resolved = ref?.resolve() ?: return null
183182
return when (resolved) {
184183
is StylesheetFile -> resolved
@@ -191,26 +190,17 @@ private fun toGetStylesheetFile(ref: PsiReference?): StylesheetFile? {
191190
}
192191
}
193192

194-
fun resolveStylesheetFromReference(element: PsiElement?): StylesheetFile? {
195-
if (element == null) return null
196-
197-
// 字符串字面量的情况:查找最近的引用表达式(支持多种父级结构)
198-
if (element is JSLiteralExpression) {
199-
// 优先查找索引访问 foo["bar"] 的首子表达式
200-
val indexed = PsiTreeUtil.getParentOfType(element, JSIndexedPropertyAccessExpression::class.java)
201-
val candidateRef = (indexed?.firstChild as? JSReferenceExpression)
202-
// 否则向上查找通用的 JSReferenceExpression(例如 foo.bar 或 更复杂结构)
203-
?: PsiTreeUtil.getParentOfType(element, JSReferenceExpression::class.java)
204-
205-
return toGetStylesheetFile(candidateRef?.reference)
206-
}
207-
208-
// 直接是引用表达式:优先用自身的 reference,再退回到 firstChild 的 reference(兼容旧逻辑)
209-
if (element is JSReferenceExpression) {
210-
return toGetStylesheetFile(element.reference ?: element.firstChild?.reference)
193+
fun resolveStylesheetFromReference(element: PsiElement?): StylesheetFile? = element?.let {
194+
when (it) {
195+
is JSLiteralExpression -> {
196+
val indexed = PsiTreeUtil.getParentOfType(it, JSIndexedPropertyAccessExpression::class.java)
197+
val candidateRef = (indexed?.firstChild as? JSReferenceExpression)
198+
?: PsiTreeUtil.getParentOfType(it, JSReferenceExpression::class.java)
199+
toGetStylesheetFile(candidateRef?.reference)
200+
}
201+
is JSReferenceExpression -> toGetStylesheetFile(it.reference ?: it.firstChild?.reference)
202+
else -> null
211203
}
212-
213-
return null
214204
}
215205

216206
/**

0 commit comments

Comments
 (0)