diff --git a/.gitignore b/.gitignore index d0179b6..5a20efa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.intellijPlatform signcerts/ distributions/ .gradle diff --git a/CHANGELOG.md b/CHANGELOG.md index 6391650..6524cf1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,17 @@ -## 0.5.2 +## 0.5.4 250624 + +### Changed +- Migrated build to IntelliJ Platform Gradle Plugin 2.x ([JetBrains docs](https://plugins.jetbrains.com/docs/intellij/tools-intellij-platform-gradle-plugin.html#configuration.repositories)) +- Updated build for compatibility with IntelliJ IDEA 2025.1 +- Upgraded Gradle wrapper to 8.14.2 +- Modernized Gradle task registration for Gradle 9.0 compatibility + +## 0.5.3 230730 + +### Fixes +- updated and tested new version for later IDE + +## 0.5.2 230629 ### Added - Refactor - extract lambda to function @@ -8,8 +21,6 @@ - Swank action - unintern symbol function - Swank action - reevalute defvar -### Changes - ### Fixes - Fixed indentation issues - Fixed symbol parsing - |123| reported as number @@ -154,4 +165,4 @@ Initial release - Eval previous/next/current form - Eval file of current editor - Eval file action -- Some basic `.cl`, `.lisp` and `.asdf` templates \ No newline at end of file +- Some basic `.cl`, `.lisp` and `.asdf` templates diff --git a/build-distributions.sh b/build-distributions.sh index f8c1b6a..7dfb6b6 100755 --- a/build-distributions.sh +++ b/build-distributions.sh @@ -1,5 +1,7 @@ #!/bin/bash +export JAVA_HOME=/usr/lib/jvm/java-24-openjdk/ + rm distributions/* echo -n Private key password: @@ -17,7 +19,7 @@ DISTRIBUTIONS="IC" for TARGET_IDE in ${DISTRIBUTIONS}; do echo Trying to build $TARGET_IDE export TARGET_IDE=$TARGET_IDE - ./gradlew clean signPlugin verifyPlugin buildPlugin || ./gradlew signPlugin verifyPlugin buildPlugin || exit + ./gradlew clean signPlugin buildPlugin || ./gradlew signPlugin buildPlugin || exit FILE=$(expandedName) NEW_FILE=$(basename ${FILE%.*}-$TARGET_IDE.zip) cp "$FILE" distributions/$NEW_FILE diff --git a/build.gradle.kts b/build.gradle.kts index 0e235b5..a101584 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,11 +1,11 @@ plugins { id("java") - id("org.jetbrains.intellij") version "1.13.3" + id("org.jetbrains.intellij.platform") version "2.6.0" id("idea") } group = "com.en_circle.slt" -version = "0.5.2" +version = "0.5.4" idea { module { @@ -16,16 +16,24 @@ idea { repositories { mavenCentral() + intellijPlatform { + defaultRepositories() + } } dependencies { + intellijPlatform { + intellijIdeaCommunity("2025.1") + // Add plugin dependencies here if needed + } implementation("org.awaitility:awaitility:4.2.0") implementation("org.watertemplate:watertemplate-engine:1.2.2") implementation("org.rauschig:jarchivelib:1.2.0") implementation("org.jsoup:jsoup:1.16.1") - testImplementation("org.junit.jupiter:junit-jupiter-api:5.9.3") - testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.9.3") + testImplementation("org.junit.jupiter:junit-jupiter-api:5.10.0") + testImplementation("junit:junit:4.13.2") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.10.0") } sourceSets { @@ -36,24 +44,8 @@ sourceSets { } } -// Configure Gradle IntelliJ Plugin -// Read more: https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html -intellij { - version.set("2022.2") - pluginName.set("slt") - var ide = System.getenv("TARGET_IDE") - if (ide == null || "" == ide) - ide = extra["targetIDE"].toString() - type.set(ide) // Target IDE Platform - - plugins.set(listOf( - - /* Plugin Dependencies */)) -} - - tasks { - val sltZip = task("sltZip", Zip::class) { + val sltZip by registering(Zip::class) { from("src/main/lisp") archiveFileName.set("slt.zip") destinationDirectory.set(File("build/resources/main")) @@ -73,7 +65,7 @@ tasks { false } } - sltZip.mustRunAfter(processResources) + sltZip.get().mustRunAfter(processResources) instrumentedJar { dependsOn(sltZip) @@ -82,6 +74,11 @@ tasks { dependsOn(sltZip) } + // Fix for Gradle 8+ task dependency validation + named("compileTestJava") { + dependsOn(sltZip) + } + // Set the JVM compatibility versions withType { sourceCompatibility = "17" @@ -89,8 +86,8 @@ tasks { } patchPluginXml { - sinceBuild.set("222") - untilBuild.set("231.*") + sinceBuild.set("251") + untilBuild.set("252.*") } signPlugin { @@ -106,5 +103,10 @@ tasks { publishPlugin { token.set(System.getenv("PUBLISH_TOKEN")) } + + // Disable searchable options index build (not needed for this plugin) + buildSearchableOptions { + enabled = false + } } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 249e583..1b33c55 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ae04661..ff23a68 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 1b6c787..23d15a9 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +82,11 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -133,22 +133,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,18 +200,28 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index 107acd3..db3a6ac 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,8 +13,10 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +27,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,13 +43,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -56,32 +59,34 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/src/main/gen/com/en_circle/slt/plugin/lisp/impl/LispFunctionEnhancementImpl.java b/src/main/gen/com/en_circle/slt/plugin/lisp/impl/LispFunctionEnhancementImpl.java new file mode 100644 index 0000000..1c436ed --- /dev/null +++ b/src/main/gen/com/en_circle/slt/plugin/lisp/impl/LispFunctionEnhancementImpl.java @@ -0,0 +1,27 @@ +// This is a generated file. Not intended for manual editing. +package com.en_circle.slt.plugin.lisp.impl; + +import com.en_circle.slt.plugin.lisp.psi.LispFunctionEnhancement; +import com.en_circle.slt.plugin.lisp.psi.LispVisitor; +import com.intellij.extapi.psi.ASTWrapperPsiElement; +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElementVisitor; +import org.jetbrains.annotations.NotNull; + +public class LispFunctionEnhancementImpl extends ASTWrapperPsiElement implements LispFunctionEnhancement { + + public LispFunctionEnhancementImpl(@NotNull ASTNode node) { + super(node); + } + + public void accept(@NotNull LispVisitor visitor) { + visitor.visitFunctionEnhancement(this); + } + + @Override + public void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof LispVisitor) accept((LispVisitor)visitor); + else super.accept(visitor); + } + +} diff --git a/src/main/gen/com/en_circle/slt/plugin/lisp/psi/LispFunctionEnhancement.java b/src/main/gen/com/en_circle/slt/plugin/lisp/psi/LispFunctionEnhancement.java new file mode 100644 index 0000000..1814b5f --- /dev/null +++ b/src/main/gen/com/en_circle/slt/plugin/lisp/psi/LispFunctionEnhancement.java @@ -0,0 +1,8 @@ +// This is a generated file. Not intended for manual editing. +package com.en_circle.slt.plugin.lisp.psi; + +import com.intellij.psi.PsiElement; + +public interface LispFunctionEnhancement extends PsiElement { + +} diff --git a/src/main/java/com/en_circle/slt/plugin/SltDocumentationProvider.java b/src/main/java/com/en_circle/slt/plugin/SltDocumentationProvider.java index bed54ec..9e35aee 100644 --- a/src/main/java/com/en_circle/slt/plugin/SltDocumentationProvider.java +++ b/src/main/java/com/en_circle/slt/plugin/SltDocumentationProvider.java @@ -4,12 +4,12 @@ import com.en_circle.slt.plugin.lisp.LispParserUtil; import com.en_circle.slt.plugin.lisp.psi.LispSymbol; import com.en_circle.slt.plugin.services.lisp.LispEnvironmentService; +import com.en_circle.slt.tools.EscapeUtils; import com.intellij.lang.documentation.AbstractDocumentationProvider; import com.intellij.openapi.util.text.HtmlBuilder; import com.intellij.openapi.util.text.HtmlChunk; import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; -import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.Nullable; @@ -95,6 +95,6 @@ private String asHtml(SymbolState state, PsiElement element) { private String escape(String s) { - return StringEscapeUtils.escapeHtml(s); + return EscapeUtils.escapeHtml4(s); } } diff --git a/src/main/java/com/en_circle/slt/plugin/SltProjectActivity.java b/src/main/java/com/en_circle/slt/plugin/SltProjectActivity.java new file mode 100644 index 0000000..3300276 --- /dev/null +++ b/src/main/java/com/en_circle/slt/plugin/SltProjectActivity.java @@ -0,0 +1,19 @@ +package com.en_circle.slt.plugin; + +import com.en_circle.slt.plugin.services.SltProjectService; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.startup.ProjectActivity; +import kotlin.Unit; +import kotlin.coroutines.Continuation; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class SltProjectActivity implements ProjectActivity { + + @Nullable + @Override + public Object execute(@NotNull Project project, @NotNull Continuation continuation) { + SltProjectService.getInstance(project); + return null; + } +} diff --git a/src/main/java/com/en_circle/slt/plugin/SltProjectListener.java b/src/main/java/com/en_circle/slt/plugin/SltProjectListener.java deleted file mode 100644 index b28bf23..0000000 --- a/src/main/java/com/en_circle/slt/plugin/SltProjectListener.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.en_circle.slt.plugin; - -import com.en_circle.slt.plugin.services.SltProjectService; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.project.ProjectManagerListener; -import org.jetbrains.annotations.NotNull; - -public class SltProjectListener implements ProjectManagerListener { - - @Override - public void projectOpened(@NotNull Project project) { - SltProjectService.getInstance(project); - } - -} diff --git a/src/main/java/com/en_circle/slt/plugin/actions/EvalFile.java b/src/main/java/com/en_circle/slt/plugin/actions/EvalFile.java index 961af8d..49de03a 100644 --- a/src/main/java/com/en_circle/slt/plugin/actions/EvalFile.java +++ b/src/main/java/com/en_circle/slt/plugin/actions/EvalFile.java @@ -1,9 +1,10 @@ package com.en_circle.slt.plugin.actions; import com.en_circle.slt.plugin.SltCommonLispFileType; +import com.intellij.ide.SaveAndSyncHandler; +import com.intellij.ide.SaveAndSyncHandler.SaveTask; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.FileContentUtilCore; @@ -17,7 +18,7 @@ public class EvalFile extends EvalActionBase { public void actionPerformed(@NotNull AnActionEvent event) { VirtualFile vf = event.getData(CommonDataKeys.VIRTUAL_FILE); if (vf != null) { - ApplicationManager.getApplication().saveAll(); + SaveAndSyncHandler.getInstance().scheduleSave(new SaveTask(Objects.requireNonNull(event.getProject()))); evaluateFile(event.getProject(), vf.getPath(), vf); for (VirtualFile openedFiles : FileEditorManager.getInstance(Objects.requireNonNull(event.getProject())) .getOpenFiles()) { diff --git a/src/main/java/com/en_circle/slt/plugin/actions/MacroexpandActionBase.java b/src/main/java/com/en_circle/slt/plugin/actions/MacroexpandActionBase.java index 5006fcf..feb626c 100644 --- a/src/main/java/com/en_circle/slt/plugin/actions/MacroexpandActionBase.java +++ b/src/main/java/com/en_circle/slt/plugin/actions/MacroexpandActionBase.java @@ -6,6 +6,7 @@ import com.en_circle.slt.plugin.lisp.LispParserUtil; import com.en_circle.slt.plugin.lisp.psi.LispList; import com.en_circle.slt.plugin.services.lisp.LispEnvironmentService; +import com.en_circle.slt.tools.EscapeUtils; import com.intellij.openapi.actionSystem.ActionUpdateThread; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; @@ -21,7 +22,6 @@ import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; -import org.apache.commons.lang.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; @@ -56,7 +56,7 @@ public void actionPerformed(@NotNull AnActionEvent event) { String packageName = LispParserUtil.getPackage(psiFile, offset); macroexpand(editor.getProject(), list, packageName, text -> SwingUtilities.invokeLater(() -> { HtmlBuilder builder = new HtmlBuilder(); - String macroExpand = StringUtils.replace(StringUtils.replace(StringEscapeUtils.escapeHtml(text), " ", " "), + String macroExpand = StringUtils.replace(StringUtils.replace(EscapeUtils.escapeHtml4(text), " ", " "), "\n", HtmlChunk.br().toString()); builder.append(HtmlChunk.raw(macroExpand)); diff --git a/src/main/java/com/en_circle/slt/plugin/highlights/SltBraceHighlighter.java b/src/main/java/com/en_circle/slt/plugin/highlights/SltBraceHighlighter.java index ea8983f..68c8930 100644 --- a/src/main/java/com/en_circle/slt/plugin/highlights/SltBraceHighlighter.java +++ b/src/main/java/com/en_circle/slt/plugin/highlights/SltBraceHighlighter.java @@ -32,7 +32,7 @@ import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypes; import com.intellij.openapi.project.Project; -import com.intellij.openapi.startup.StartupActivity; +import com.intellij.openapi.startup.ProjectActivity; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiBinaryFile; @@ -44,6 +44,8 @@ import com.intellij.util.Alarm; import com.intellij.util.containers.Stack; import com.intellij.util.text.CharArrayUtil; +import kotlin.Unit; +import kotlin.coroutines.Continuation; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -53,21 +55,23 @@ // Copied from IJ source to implement highlight WITHOUT smart insertion! -public class SltBraceHighlighter implements StartupActivity.DumbAware { +public class SltBraceHighlighter implements ProjectActivity { private static final Key> BRACE_HIGHLIGHTERS_IN_EDITOR_VIEW_KEY = Key.create("BraceHighlighter.BRACE_HIGHLIGHTERS_IN_EDITOR_VIEW_KEY"); private static final Key LINE_MARKER_IN_EDITOR_KEY = Key.create("BraceHighlighter.LINE_MARKER_IN_EDITOR_KEY"); private final Alarm alarm = new Alarm(); + @Nullable @Override - public void runActivity(@NotNull Project project) { + public Object execute(@NotNull Project project, @NotNull Continuation continuation) { if (ApplicationManager.getApplication().isHeadlessEnvironment() && !ApplicationManager.getApplication().isUnitTestMode() || !IdentifierHighlighterPassFactory.isEnabled()) { - return; + return null; } Disposable activityDisposable = SltProjectService.getInstance(project); registerListeners(project, activityDisposable); + return null; } private void registerListeners(@NotNull Project project, @NotNull Disposable parentDisposable) { @@ -257,6 +261,7 @@ private void highlightRightBrace(Editor editor, @NotNull HighlighterIterator ite highlightBraces(editor, brace2, brace1, matched, false, fileType); } + @SuppressWarnings("SameParameterValue") private void highlightLeftBrace(Editor editor, @NotNull HighlighterIterator iterator, boolean scopeHighlighting, @NotNull FileType fileType, Document document) { TextRange brace1Start = TextRange.create(iterator.getStart(), iterator.getEnd()); boolean matched = matchBrace(document.getCharsSequence(), fileType, iterator, true); @@ -479,6 +484,7 @@ private static synchronized boolean matchBrace(@NotNull CharSequence fileText, } + @SuppressWarnings("BooleanMethodIsAlwaysInverted") private static boolean isPairBraces(@NotNull IElementType tokenType1, @NotNull IElementType tokenType2, @NotNull FileType fileType) { return (tokenType1.equals(LispTypes.LPAREN) && tokenType2.equals(LispTypes.RPAREN)) || (tokenType1.equals(LispTypes.RPAREN) && tokenType2.equals(LispTypes.LPAREN)); } diff --git a/src/main/java/com/en_circle/slt/plugin/indentation/SltIndentator.java b/src/main/java/com/en_circle/slt/plugin/indentation/SltIndentator.java index 41e2983..e0809f0 100644 --- a/src/main/java/com/en_circle/slt/plugin/indentation/SltIndentator.java +++ b/src/main/java/com/en_circle/slt/plugin/indentation/SltIndentator.java @@ -9,6 +9,7 @@ import com.intellij.openapi.editor.actionSystem.EditorActionHandler; import com.intellij.openapi.editor.actionSystem.EditorActionManager; import com.intellij.openapi.editor.ex.util.EditorUIUtil; +import com.intellij.openapi.editor.ex.util.LexerEditorHighlighter.InvalidStateException; import com.intellij.openapi.editor.textarea.TextComponentEditor; import com.intellij.openapi.util.Ref; import com.intellij.psi.PsiDocumentManager; @@ -99,7 +100,11 @@ public void run() { EditorModificationUtil.deleteSelectedText(editor); int caretOffset = editor.getCaretModel().getOffset(); String s = "\n" + StringUtils.repeat(' ', additionalOffset); - document.insertString(caretOffset, s); + try { + document.insertString(caretOffset, s); + } catch (InvalidStateException ignored) { + // lexer error is ignored + } editor.getCaretModel().moveToOffset(caretOffset + s.length()); EditorModificationUtil.scrollToCaret(editor); editor.getSelectionModel().removeSelection(); diff --git a/src/main/java/com/en_circle/slt/plugin/ui/SltCoreWindow.java b/src/main/java/com/en_circle/slt/plugin/ui/SltCoreWindow.java index bf46298..6dc7600 100644 --- a/src/main/java/com/en_circle/slt/plugin/ui/SltCoreWindow.java +++ b/src/main/java/com/en_circle/slt/plugin/ui/SltCoreWindow.java @@ -16,11 +16,13 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.wm.ToolWindow; -import com.intellij.ui.tabs.impl.JBTabsImpl; +import com.intellij.ui.tabs.JBTabs; +import com.intellij.ui.tabs.JBTabsFactory; import org.jetbrains.annotations.NotNull; import javax.swing.*; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.Dimension; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -30,7 +32,7 @@ public class SltCoreWindow implements LispEnvironmentListener, Disposable { private final Project project; private final JTextField process; private final JPanel content; - private final JBTabsImpl tabs; + private final JBTabs tabs; private final List components = Collections.synchronizedList(new ArrayList<>()); @@ -67,7 +69,7 @@ public SltCoreWindow(ToolWindow toolWindow) { content.add(processInfo, BorderLayout.NORTH); - tabs = new JBTabsImpl(toolWindow.getProject()); + tabs = JBTabsFactory.createTabs(toolWindow.getProject()); for (SltComponent component : components) { tabs.addTab(component.create()); } diff --git a/src/main/java/com/en_circle/slt/plugin/ui/SltPackageWidget.java b/src/main/java/com/en_circle/slt/plugin/ui/SltPackageWidget.java index 7c7250e..4e42e7e 100644 --- a/src/main/java/com/en_circle/slt/plugin/ui/SltPackageWidget.java +++ b/src/main/java/com/en_circle/slt/plugin/ui/SltPackageWidget.java @@ -10,7 +10,6 @@ import com.intellij.openapi.editor.EditorFactory; import com.intellij.openapi.editor.event.*; import com.intellij.openapi.editor.ex.EditorEx; -import com.intellij.openapi.fileEditor.FileEditorManagerEvent; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.NlsContexts.Label; @@ -127,11 +126,6 @@ public void caretRemoved(@NotNull CaretEvent e) { updatePosition(e.getEditor()); } - @Override - public void selectionChanged(@NotNull FileEditorManagerEvent event) { - updatePosition(getEditor()); - } - @Override public void afterDocumentChange(@NotNull Document document) { EditorFactory.getInstance().editors(document) diff --git a/src/main/java/com/en_circle/slt/plugin/ui/console/SltConsole.java b/src/main/java/com/en_circle/slt/plugin/ui/console/SltConsole.java index 7f59e24..55a675e 100644 --- a/src/main/java/com/en_circle/slt/plugin/ui/console/SltConsole.java +++ b/src/main/java/com/en_circle/slt/plugin/ui/console/SltConsole.java @@ -109,7 +109,7 @@ private void openSymbolNavigator(Project project, String symbol) { protected void eval(String data) { try { if (StringUtils.isNotBlank(data)) { - String setToStar = String.format("(setf * %s)", data); + String setToStar = String.format("(cl::setf cl::* %s)", data); LispEnvironmentService.getInstance(project).sendToLisp(Eval.eval(setToStar, currentPackage, result -> { resultData.clear(); diff --git a/src/main/java/com/en_circle/slt/plugin/ui/debug/SltDebuggerImpl.java b/src/main/java/com/en_circle/slt/plugin/ui/debug/SltDebuggerImpl.java index f843fc9..3ca57f4 100644 --- a/src/main/java/com/en_circle/slt/plugin/ui/debug/SltDebuggerImpl.java +++ b/src/main/java/com/en_circle/slt/plugin/ui/debug/SltDebuggerImpl.java @@ -32,8 +32,9 @@ import com.intellij.ui.components.JBScrollPane; import com.intellij.ui.components.JBTextArea; import com.intellij.ui.components.JBTextField; +import com.intellij.ui.tabs.JBTabs; +import com.intellij.ui.tabs.JBTabsFactory; import com.intellij.ui.tabs.TabInfo; -import com.intellij.ui.tabs.impl.JBTabsImpl; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; @@ -263,9 +264,9 @@ public void mouseClicked(MouseEvent e) { singleFrameComponent = new JPanel(new BorderLayout()); TabInfo singleFrame = new TabInfo(singleFrameComponent); singleFrame.setText(SltBundle.message("slt.ui.debugger.frame")); - JBTabsImpl singleFrameParent = new JBTabsImpl(parent.getProject()); + JBTabs singleFrameParent = JBTabsFactory.createTabs(parent.getProject()); singleFrameParent.addTab(singleFrame); - splitter.setSecondComponent(singleFrameParent); + splitter.setSecondComponent((JComponent) singleFrameParent); } private void enableStepping() { diff --git a/src/main/java/com/en_circle/slt/plugin/ui/debug/SltDebuggers.java b/src/main/java/com/en_circle/slt/plugin/ui/debug/SltDebuggers.java index f8edff6..d5f59af 100644 --- a/src/main/java/com/en_circle/slt/plugin/ui/debug/SltDebuggers.java +++ b/src/main/java/com/en_circle/slt/plugin/ui/debug/SltDebuggers.java @@ -9,10 +9,11 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.wm.ToolWindow; import com.intellij.ui.content.Content; -import com.intellij.ui.tabs.impl.JBTabsImpl; +import com.intellij.ui.tabs.JBTabs; +import com.intellij.ui.tabs.JBTabsFactory; import javax.swing.*; -import java.awt.*; +import java.awt.BorderLayout; import java.math.BigInteger; import java.util.*; @@ -20,7 +21,7 @@ public class SltDebuggers implements DebugInterface, LispEnvironmentListener { private final ToolWindow toolWindow; private final JPanel content; - private final JBTabsImpl tabs; + private final JBTabs tabs; private final Map activeDebuggers = Collections.synchronizedMap(new HashMap<>()); private final Set toActivateDebuggers = Collections.synchronizedSet(new HashSet<>()); @@ -29,7 +30,7 @@ public class SltDebuggers implements DebugInterface, LispEnvironmentListener { public SltDebuggers(ToolWindow toolWindow) { this.toolWindow = toolWindow; this.content = new JPanel(new BorderLayout()); - this.tabs = new JBTabsImpl(toolWindow.getProject()); + this.tabs = JBTabsFactory.createTabs(toolWindow.getProject()); this.content.add(this.tabs.getComponent()); LispEnvironmentService.getInstance(toolWindow.getProject()).addServerListener(this); @@ -65,7 +66,7 @@ public void onDebugActivate(BigInteger debugId, BigInteger level) { if (activeDebuggers.containsKey(debugId)) { activeDebuggers.get(debugId).activate(); tabs.select(activeDebuggers.get(debugId).getTab(), true); - tabs.requestFocusInWindow(); + ((JComponent) tabs).requestFocusInWindow(); toolWindow.getContentManager().setSelectedContent(self, true); } else { toActivateDebuggers.add(debugId); diff --git a/src/main/java/com/en_circle/slt/plugin/ui/debug/SltFrameInfo.java b/src/main/java/com/en_circle/slt/plugin/ui/debug/SltFrameInfo.java index 9dd91cd..bc43793 100644 --- a/src/main/java/com/en_circle/slt/plugin/ui/debug/SltFrameInfo.java +++ b/src/main/java/com/en_circle/slt/plugin/ui/debug/SltFrameInfo.java @@ -12,15 +12,17 @@ import com.intellij.ui.components.JBScrollPane; import com.intellij.ui.table.JBTable; import com.intellij.ui.tabs.JBTabs; +import com.intellij.ui.tabs.JBTabsFactory; import com.intellij.ui.tabs.TabInfo; -import com.intellij.ui.tabs.impl.JBTabsImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.swing.*; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; -import java.awt.*; +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Cursor; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.font.TextAttribute; @@ -55,7 +57,7 @@ public SltFrameInfo(Project project, BigInteger threadId, BigInteger frameId, St } private void create() { - tabs = new JBTabsImpl(project); + tabs = JBTabsFactory.createTabs(project); localsTable = new JBTable(new FrameListTableModel(new ArrayList<>())); localsTable.setFillsViewportHeight(true); diff --git a/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationABCLProcess.java b/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationABCLProcess.java index 1014b1d..c981c5b 100644 --- a/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationABCLProcess.java +++ b/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationABCLProcess.java @@ -86,15 +86,15 @@ public SdkConfigurationABCLProcess(@NotNull Component parent, LispSdk instance, quicklispPath.getField().setText(instance.quickLispPath); TextFieldWithBrowseButton abclExecutablePicker = new TextFieldWithBrowseButton(jvmExecutable.getField()); - abclExecutablePicker.addBrowseFolderListener( - SltBundle.message("slt.ui.settings.sdk.editor.jvm.select"), "", null, descriptor); + abclExecutablePicker.addBrowseFolderListener(null, + descriptor.withTitle(SltBundle.message("slt.ui.settings.sdk.editor.jvm.select")).withDescription("")); TextFieldWithBrowseButton abclJarPicker = new TextFieldWithBrowseButton(jar.getField()); - abclJarPicker.addBrowseFolderListener( - SltBundle.message("slt.ui.settings.sdk.editor.abcl.select"), "", null, descriptorJar); + abclJarPicker.addBrowseFolderListener(null, + descriptor.withTitle(SltBundle.message("slt.ui.settings.sdk.editor.abcl.select")).withDescription("")); TextFieldWithBrowseButton quicklispPathPicker = new TextFieldWithBrowseButton(quicklispPath.getField()); //noinspection DialogTitleCapitalization - quicklispPathPicker.addBrowseFolderListener( - SltBundle.message("slt.ui.settings.sdk.editor.quicklisp.select"), "", null, descriptor); + quicklispPathPicker.addBrowseFolderListener(null, + descriptor.withTitle(SltBundle.message("slt.ui.settings.sdk.editor.quicklisp.select")).withDescription("")); return new FormBuilder() .addLabeledComponent(SltBundle.message("slt.ui.settings.sdk.editor.name"), name, 1, false) diff --git a/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationAllegroCLProcess.java b/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationAllegroCLProcess.java index 3b8948f..8cad87b 100644 --- a/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationAllegroCLProcess.java +++ b/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationAllegroCLProcess.java @@ -80,15 +80,14 @@ public SdkConfigurationAllegroCLProcess(@NotNull Component parent, LispSdk insta quicklispPath.getField().setText(instance.quickLispPath); TextFieldWithBrowseButton cclExecutablePicker = new TextFieldWithBrowseButton(allegroExecutable.getField()); - cclExecutablePicker.addBrowseFolderListener( - SltBundle.message("slt.ui.settings.sdk.editor.allegro.executable.select"), "", null, descriptor); + cclExecutablePicker.addBrowseFolderListener(null, descriptor.withTitle(SltBundle.message("slt.ui.settings.sdk.editor.allegro.executable.select")).withDescription("")); TextFieldWithBrowseButton cclImagePicker = new TextFieldWithBrowseButton(allegroImage.getField()); - cclImagePicker.addBrowseFolderListener( - SltBundle.message("slt.ui.settings.sdk.editor.allegro.image.select"), "", null, descriptor); + cclImagePicker.addBrowseFolderListener(null, + descriptor.withTitle(SltBundle.message("slt.ui.settings.sdk.editor.allegro.image.select")).withDescription("")); TextFieldWithBrowseButton quicklispPathPicker = new TextFieldWithBrowseButton(quicklispPath.getField()); //noinspection DialogTitleCapitalization - quicklispPathPicker.addBrowseFolderListener( - SltBundle.message("slt.ui.settings.sdk.editor.quicklisp.select"), "", null, descriptor); + quicklispPathPicker.addBrowseFolderListener(null, + descriptor.withTitle(SltBundle.message("slt.ui.settings.sdk.editor.quicklisp.select")).withDescription("")); return new FormBuilder() .addLabeledComponent(SltBundle.message("slt.ui.settings.sdk.editor.name"), name, 1, false) diff --git a/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationCCLProcess.java b/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationCCLProcess.java index 46dd092..4eaec62 100644 --- a/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationCCLProcess.java +++ b/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationCCLProcess.java @@ -80,15 +80,15 @@ public SdkConfigurationCCLProcess(@NotNull Component parent, LispSdk instance, S quicklispPath.getField().setText(instance.quickLispPath); TextFieldWithBrowseButton cclExecutablePicker = new TextFieldWithBrowseButton(cclExecutable.getField()); - cclExecutablePicker.addBrowseFolderListener( - SltBundle.message("slt.ui.settings.sdk.editor.ccl.executable.select"), "", null, descriptor); + cclExecutablePicker.addBrowseFolderListener(null, + descriptor.withTitle(SltBundle.message("slt.ui.settings.sdk.editor.ccl.executable.select")).withDescription("")); TextFieldWithBrowseButton cclImagePicker = new TextFieldWithBrowseButton(cclImage.getField()); - cclImagePicker.addBrowseFolderListener( - SltBundle.message("slt.ui.settings.sdk.editor.ccl.image.select"), "", null, descriptor); + cclImagePicker.addBrowseFolderListener(null, + descriptor.withTitle(SltBundle.message("slt.ui.settings.sdk.editor.ccl.image.select")).withDescription("")); TextFieldWithBrowseButton quicklispPathPicker = new TextFieldWithBrowseButton(quicklispPath.getField()); //noinspection DialogTitleCapitalization - quicklispPathPicker.addBrowseFolderListener( - SltBundle.message("slt.ui.settings.sdk.editor.quicklisp.select"), "", null, descriptor); + quicklispPathPicker.addBrowseFolderListener(null, + descriptor.withTitle(SltBundle.message("slt.ui.settings.sdk.editor.quicklisp.select")).withDescription("")); return new FormBuilder() .addLabeledComponent(SltBundle.message("slt.ui.settings.sdk.editor.name"), name, 1, false) diff --git a/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationCMUCLProcess.java b/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationCMUCLProcess.java index e5db99f..4aa5822 100644 --- a/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationCMUCLProcess.java +++ b/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationCMUCLProcess.java @@ -80,15 +80,15 @@ public SdkConfigurationCMUCLProcess(@NotNull Component parent, LispSdk instance, quicklispPath.getField().setText(instance.quickLispPath); TextFieldWithBrowseButton cmuclExecutablePicker = new TextFieldWithBrowseButton(cmuclExecutable.getField()); - cmuclExecutablePicker.addBrowseFolderListener( - SltBundle.message("slt.ui.settings.sdk.editor.cmucl.executable.select"), "", null, descriptor); + cmuclExecutablePicker.addBrowseFolderListener(null, + descriptor.withTitle(SltBundle.message("slt.ui.settings.sdk.editor.cmucl.executable.select")).withDescription("")); TextFieldWithBrowseButton cmuclImagePicker = new TextFieldWithBrowseButton(cmuclImage.getField()); - cmuclImagePicker.addBrowseFolderListener( - SltBundle.message("slt.ui.settings.sdk.editor.cmucl.image.select"), "", null, descriptor); + cmuclImagePicker.addBrowseFolderListener(null, + descriptor.withTitle(SltBundle.message("slt.ui.settings.sdk.editor.cmucl.image.select")).withDescription("")); TextFieldWithBrowseButton quicklispPathPicker = new TextFieldWithBrowseButton(quicklispPath.getField()); //noinspection DialogTitleCapitalization - quicklispPathPicker.addBrowseFolderListener( - SltBundle.message("slt.ui.settings.sdk.editor.quicklisp.select"), "", null, descriptor); + quicklispPathPicker.addBrowseFolderListener(null, + descriptor.withTitle(SltBundle.message("slt.ui.settings.sdk.editor.quicklisp.select")).withDescription("")); return new FormBuilder() .addLabeledComponent(SltBundle.message("slt.ui.settings.sdk.editor.name"), name, 1, false) diff --git a/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationSBCLProcess.java b/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationSBCLProcess.java index 42cd968..673ac7d 100644 --- a/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationSBCLProcess.java +++ b/src/main/java/com/en_circle/slt/plugin/ui/sdk/SdkConfigurationSBCLProcess.java @@ -80,15 +80,15 @@ public SdkConfigurationSBCLProcess(@NotNull Component parent, LispSdk instance, quicklispPath.getField().setText(instance.quickLispPath); TextFieldWithBrowseButton sbclExecutablePicker = new TextFieldWithBrowseButton(sbclExecutable.getField()); - sbclExecutablePicker.addBrowseFolderListener( - SltBundle.message("slt.ui.settings.sdk.editor.sbcl.executable.select"), "", null, descriptor); + sbclExecutablePicker.addBrowseFolderListener(null, + descriptor.withTitle(SltBundle.message("slt.ui.settings.sdk.editor.sbcl.executable.select")).withDescription("")); TextFieldWithBrowseButton sbclCorePicker = new TextFieldWithBrowseButton(sbclCore.getField()); - sbclCorePicker.addBrowseFolderListener( - SltBundle.message("slt.ui.settings.sdk.editor.sbcl.core.select"), "", null, descriptor); + sbclCorePicker.addBrowseFolderListener(null, + descriptor.withTitle(SltBundle.message("slt.ui.settings.sdk.editor.sbcl.core.select")).withDescription("")); TextFieldWithBrowseButton quicklispPathPicker = new TextFieldWithBrowseButton(quicklispPath.getField()); //noinspection DialogTitleCapitalization - quicklispPathPicker.addBrowseFolderListener( - SltBundle.message("slt.ui.settings.sdk.editor.quicklisp.select"), "", null, descriptor); + quicklispPathPicker.addBrowseFolderListener(null, + descriptor.withTitle(SltBundle.message("slt.ui.settings.sdk.editor.quicklisp.select")).withDescription("")); return new FormBuilder() .addLabeledComponent(SltBundle.message("slt.ui.settings.sdk.editor.name"), name, 1, false) diff --git a/src/main/java/com/en_circle/slt/tools/EscapeUtils.java b/src/main/java/com/en_circle/slt/tools/EscapeUtils.java new file mode 100644 index 0000000..54654bf --- /dev/null +++ b/src/main/java/com/en_circle/slt/tools/EscapeUtils.java @@ -0,0 +1,11 @@ +package com.en_circle.slt.tools; + +import com.google.common.html.HtmlEscapers; + +public class EscapeUtils { + + public static String escapeHtml4(String html) { + return HtmlEscapers.htmlEscaper().escape(html); + } + +} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index f1e0a76..b353e18 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -142,6 +142,8 @@ + + @@ -274,22 +276,26 @@ - 0.5.1 New features:


-

Symbol inspection


-

Rainbow braces option


-

More CLHS browser options


-

Evaluate top level action


+

0.5.4 Changes and fixes:


+

Fixed build for new version


+

0.5.3 Changes and fixes:


+

Fixed build for new version


+

0.5.2 New features:


+

Refactor - extract lambda to function


+

Refactor - rename symbol


+

Swank action - disassemble


+

Swank action - undefine function


+

Swank action - unintern symbol function


+

Swank action - reevalute defvar



-

0.5.1 Changes and fixes:


-

Macroexpand is now action and menu, no longer automatic!


-

Added symbols with no file into all search places


+

0.5.2 Changes and fixes:


+

Fixed indentation issues


+

Fixed symbol parsing - |123| reported as number


+

Fixed #88, #83



See CHANGELOG.md for more details ]]>
- \ No newline at end of file