Skip to content

Commit e5d0c69

Browse files
committed
Fix "Create procedure" placement of script
1 parent 370ac1a commit e5d0c69

File tree

5 files changed

+82
-95
lines changed

5 files changed

+82
-95
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
### Fixed
55
- Fix regular expressions not being allowed in hook transmits list.
66
- Fix invalid symbol file inspection reporting an error for "commands.sym".
7+
- Fix "Create procedure" placement of script.
78

89
### Changed
910
- Inspections that require symbols will no longer run on files outside the project.
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package io.runescript.plugin.ide.inspections
2+
3+
import com.intellij.codeInsight.intention.preview.IntentionPreviewInfo
4+
import com.intellij.codeInspection.LocalQuickFix
5+
import com.intellij.codeInspection.ProblemDescriptor
6+
import com.intellij.openapi.editor.ScrollType
7+
import com.intellij.openapi.fileEditor.FileEditorManager
8+
import com.intellij.openapi.fileEditor.OpenFileDescriptor
9+
import com.intellij.openapi.project.Project
10+
import com.intellij.psi.PsiDocumentManager
11+
import com.intellij.psi.util.findParentOfType
12+
import io.runescript.plugin.lang.psi.RsElementGenerator
13+
import io.runescript.plugin.lang.psi.RsScript
14+
15+
class RsCreateScriptQuickFix(private val trigger: String, private val functionName: String) : LocalQuickFix {
16+
17+
override fun getName(): String {
18+
return "Create script ('${functionName}')"
19+
}
20+
21+
override fun getFamilyName(): String {
22+
return "Create script"
23+
}
24+
25+
override fun generatePreview(project: Project, previewDescriptor: ProblemDescriptor): IntentionPreviewInfo =
26+
IntentionPreviewInfo.EMPTY
27+
28+
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
29+
val newScript = RsScriptBuilder(trigger, functionName)
30+
.statement("error(\"Not yet implemented\");")
31+
.build(project)
32+
val parentScript = descriptor.psiElement.findParentOfType<RsScript>()!!
33+
val parentFile = parentScript.parent
34+
parentFile.addAfter(newScript, parentScript)
35+
parentFile.addAfter(RsElementGenerator.createNewLine(project), parentScript)
36+
openAndSelect(project, newScript)
37+
}
38+
39+
private fun openAndSelect(project: Project, script: RsScript) {
40+
val containingFile = script.containingFile.virtualFile ?: return
41+
val openDescriptor = OpenFileDescriptor(project, containingFile)
42+
val textEditor = FileEditorManager.getInstance(project).openTextEditor(openDescriptor, true) ?: return
43+
textEditor.selectionModel.removeSelection()
44+
val endOffset = script.textRange.endOffset
45+
textEditor.caretModel.moveToOffset(endOffset + 1)
46+
val manager = PsiDocumentManager.getInstance(project)
47+
manager.doPostponedOperationsAndUnblockDocument(textEditor.document)
48+
textEditor.scrollingModel.scrollToCaret(ScrollType.RELATIVE)
49+
}
50+
}
Lines changed: 6 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,11 @@
11
package io.runescript.plugin.ide.inspections
22

3-
import com.intellij.codeInspection.*
4-
import com.intellij.openapi.editor.EditorModificationUtilEx
5-
import com.intellij.openapi.editor.ScrollType
6-
import com.intellij.openapi.fileEditor.FileEditorManager
7-
import com.intellij.openapi.fileEditor.OpenFileDescriptor
8-
import com.intellij.openapi.project.Project
9-
import com.intellij.psi.PsiDocumentManager
3+
import com.intellij.codeInspection.LocalInspectionTool
4+
import com.intellij.codeInspection.ProblemHighlightType
5+
import com.intellij.codeInspection.ProblemsHolder
106
import com.intellij.psi.PsiElementVisitor
11-
import com.intellij.psi.util.findParentOfType
127
import io.runescript.plugin.ide.RsBundle
138
import io.runescript.plugin.lang.psi.RsHookFragment
14-
import io.runescript.plugin.lang.psi.RsScript
159
import io.runescript.plugin.lang.psi.RsVisitor
1610
import io.runescript.plugin.lang.psi.isSourceFile
1711

@@ -23,46 +17,13 @@ class RuneScriptUnresolvedClientscriptInspection : LocalInspectionTool() {
2317
if (!o.isSourceFile()) return
2418
val resolvedClientScript = o.reference!!.resolve()
2519
if (resolvedClientScript == null) {
26-
holder.registerProblem(o.nameLiteral,
20+
holder.registerProblem(
21+
o.nameLiteral,
2722
RsBundle.message("inspection.error.unresolved.clientscript", o.nameLiteral.text),
28-
ProblemHighlightType.LIKE_UNKNOWN_SYMBOL,
29-
RsUnresolvedClientscriptQuickFix(o.nameLiteral.text)
23+
ProblemHighlightType.LIKE_UNKNOWN_SYMBOL
3024
)
3125
}
3226
}
3327
}
3428
}
35-
36-
class RsUnresolvedClientscriptQuickFix(private val functionName: String) : LocalQuickFix {
37-
38-
override fun getName(): String {
39-
return "Create clientscript ('${functionName}')"
40-
}
41-
42-
override fun getFamilyName(): String {
43-
return "Create clientscript"
44-
}
45-
46-
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
47-
val newScript = RsScriptBuilder("clientscript", functionName)
48-
.statement("error(\"Not yet implemented\");")
49-
.build(project)
50-
val parentScript = descriptor.psiElement.findParentOfType<RsScript>()!!
51-
val parentFile = parentScript.parent!!
52-
parentFile.addAfter(newScript, parentScript)
53-
openAndSelect(project, newScript)
54-
}
55-
56-
private fun openAndSelect(project: Project, script: RsScript) {
57-
val openDescriptor = OpenFileDescriptor(project, script.containingFile.virtualFile)
58-
val textEditor = FileEditorManager.getInstance(project).openTextEditor(openDescriptor, true)!!
59-
textEditor.selectionModel.removeSelection()
60-
val endOffset = script.textRange.endOffset
61-
textEditor.caretModel.moveToOffset(endOffset + 1)
62-
val manager = PsiDocumentManager.getInstance(project)
63-
manager.doPostponedOperationsAndUnblockDocument(textEditor.document)
64-
EditorModificationUtilEx.insertStringAtCaret(textEditor, "\n", false, false)
65-
textEditor.scrollingModel.scrollToCaret(ScrollType.RELATIVE)
66-
}
67-
}
6829
}
Lines changed: 8 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,11 @@
11
package io.runescript.plugin.ide.inspections
22

3-
import com.intellij.codeInspection.*
4-
import com.intellij.openapi.editor.EditorModificationUtilEx
5-
import com.intellij.openapi.editor.ScrollType
6-
import com.intellij.openapi.fileEditor.FileEditorManager
7-
import com.intellij.openapi.fileEditor.OpenFileDescriptor
8-
import com.intellij.openapi.project.Project
9-
import com.intellij.psi.PsiDocumentManager
3+
import com.intellij.codeInspection.LocalInspectionTool
4+
import com.intellij.codeInspection.ProblemHighlightType
5+
import com.intellij.codeInspection.ProblemsHolder
106
import com.intellij.psi.PsiElementVisitor
11-
import com.intellij.psi.util.findParentOfType
127
import io.runescript.plugin.ide.RsBundle
138
import io.runescript.plugin.lang.psi.RsGosubExpression
14-
import io.runescript.plugin.lang.psi.RsScript
159
import io.runescript.plugin.lang.psi.RsVisitor
1610
import io.runescript.plugin.lang.psi.isSourceFile
1711

@@ -23,46 +17,14 @@ class RuneScriptUnresolvedProcedureInspection : LocalInspectionTool() {
2317
if (!o.isSourceFile()) return
2418
val resolvedGosub = o.reference!!.resolve()
2519
if (resolvedGosub == null) {
26-
holder.registerProblem(o.nameLiteral,
27-
RsBundle.message("inspection.error.unresolved.procedure", o.nameLiteral.text),
28-
ProblemHighlightType.LIKE_UNKNOWN_SYMBOL,
29-
RsUnresolvedReferenceQuickFix(o.nameLiteral.text)
20+
holder.registerProblem(
21+
o.nameLiteral,
22+
RsBundle.message("inspection.error.unresolved.procedure", o.nameLiteral.text),
23+
ProblemHighlightType.LIKE_UNKNOWN_SYMBOL,
24+
RsCreateScriptQuickFix("proc", o.nameLiteral.text)
3025
)
3126
}
3227
}
3328
}
3429
}
35-
36-
class RsUnresolvedReferenceQuickFix(private val functionName: String) : LocalQuickFix {
37-
38-
override fun getName(): String {
39-
return "Create procedure ('${functionName}')"
40-
}
41-
42-
override fun getFamilyName(): String {
43-
return "Create procedure"
44-
}
45-
46-
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
47-
val newScript = RsScriptBuilder("proc", functionName)
48-
.statement("error(\"Not yet implemented\");")
49-
.build(project)
50-
val parentScript = descriptor.psiElement.findParentOfType<RsScript>()!!
51-
val parentFile = parentScript.parent!!
52-
parentFile.addAfter(newScript, parentScript)
53-
openAndSelect(project, newScript)
54-
}
55-
56-
private fun openAndSelect(project: Project, script: RsScript) {
57-
val openDescriptor = OpenFileDescriptor(project, script.containingFile.virtualFile)
58-
val textEditor = FileEditorManager.getInstance(project).openTextEditor(openDescriptor, true)!!
59-
textEditor.selectionModel.removeSelection()
60-
val endOffset = script.textRange.endOffset
61-
textEditor.caretModel.moveToOffset(endOffset + 1)
62-
val manager = PsiDocumentManager.getInstance(project)
63-
manager.doPostponedOperationsAndUnblockDocument(textEditor.document)
64-
EditorModificationUtilEx.insertStringAtCaret(textEditor, "\n", false, false)
65-
textEditor.scrollingModel.scrollToCaret(ScrollType.RELATIVE)
66-
}
67-
}
6830
}

src/main/kotlin/io/runescript/plugin/lang/psi/RsElementGenerator.kt

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package io.runescript.plugin.lang.psi
22

33
import com.intellij.openapi.project.Project
4+
import com.intellij.openapi.util.text.StringUtil
45
import com.intellij.psi.PsiElement
56
import com.intellij.psi.PsiFile
67
import com.intellij.psi.PsiFileFactory
8+
import com.intellij.psi.PsiWhiteSpace
9+
import com.intellij.psi.TokenType
710
import com.intellij.psi.impl.PsiFileFactoryImpl
11+
import com.intellij.psi.tree.TokenSet
812
import com.intellij.psi.util.PsiTreeUtil
13+
import com.intellij.psi.util.childrenOfType
914
import com.intellij.testFramework.LightVirtualFile
1015
import io.runescript.plugin.ide.filetypes.RsFileType
1116
import io.runescript.plugin.lang.RuneScript
@@ -17,15 +22,18 @@ object RsElementGenerator {
1722
return PsiTreeUtil.findChildOfType(element, RsExpression::class.java) as RsExpression
1823

1924
}
25+
2026
fun createIntegerLiteral(project: Project, replacement: String): PsiElement {
2127
val element = createDummyFile(project, "[proc,dummy]()()$replacement;")
22-
val literal = PsiTreeUtil.findChildOfType(element, RsIntegerLiteralExpression::class.java) as RsIntegerLiteralExpression
28+
val literal =
29+
PsiTreeUtil.findChildOfType(element, RsIntegerLiteralExpression::class.java) as RsIntegerLiteralExpression
2330
return literal.node.firstChildNode.psi!!
2431
}
2532

2633
fun createColorTag(project: Project, color: Int, tagName: String = "col"): PsiElement {
2734
val element = createDummyFile(project, "[proc,dummy]()()\"<$tagName=%06x>\";".format(color and 0xffffff))
28-
val literal = PsiTreeUtil.findChildOfType(element, RsStringLiteralExpression::class.java) as RsStringLiteralExpression
35+
val literal =
36+
PsiTreeUtil.findChildOfType(element, RsStringLiteralExpression::class.java) as RsStringLiteralExpression
2937
return literal.node.findChildByType(RsElementTypes.STRING_TAG)!!.psi
3038
}
3139

@@ -41,14 +49,19 @@ object RsElementGenerator {
4149

4250
fun createStringLiteralContent(project: Project, content: String): RsStringLiteralContent {
4351
val element = createDummyFile(project, "[proc,dummy]()()\"$content\";")
44-
val literal = PsiTreeUtil.findChildOfType(element, RsStringLiteralExpression::class.java) as RsStringLiteralExpression
52+
val literal =
53+
PsiTreeUtil.findChildOfType(element, RsStringLiteralExpression::class.java) as RsStringLiteralExpression
4554
return PsiTreeUtil.findChildOfType(literal, RsStringLiteralContent::class.java) as RsStringLiteralContent
4655
}
4756

4857
private fun createDummyFile(project: Project, text: String): PsiFile {
4958
val factory = PsiFileFactory.getInstance(project) as PsiFileFactoryImpl
5059
val name = "dummy.${RsFileType.defaultExtension}"
51-
val virtualFile = LightVirtualFile(name, RsFileType, text)
60+
val virtualFile = LightVirtualFile(name, RsFileType, StringUtil.convertLineSeparators(text))
5261
return factory.trySetupPsiForFile(virtualFile, RuneScript, false, true)!!
5362
}
63+
64+
fun createNewLine(project: Project): PsiElement {
65+
return createDummyFile(project, "\n").firstChild
66+
}
5467
}

0 commit comments

Comments
 (0)