diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 842c1bd79..58f97a76d 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -190,4 +190,6 @@ fun getEnvOrProp(key: String): String? { afterEvaluate { tasks.getByName("mergeDebugAssets").dependsOn(":subprojects:tooling-api-impl:copyJarToAssets") tasks.getByName("mergeReleaseAssets").dependsOn(":subprojects:tooling-api-impl:copyJarToAssets") + tasks.getByName("lintAnalyzeDebug").dependsOn(":subprojects:tooling-api-impl:copyJarToAssets") + tasks.getByName("lintAnalyzeRelease").dependsOn(":subprojects:tooling-api-impl:copyJarToAssets") } \ No newline at end of file diff --git a/editor/src/main/java/com/itsaky/androidide/editor/language/incremental/BaseIncrementalAnalyzeManager.java b/editor/src/main/java/com/itsaky/androidide/editor/language/incremental/BaseIncrementalAnalyzeManager.java index 487d4e45f..2323e886d 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/language/incremental/BaseIncrementalAnalyzeManager.java +++ b/editor/src/main/java/com/itsaky/androidide/editor/language/incremental/BaseIncrementalAnalyzeManager.java @@ -17,41 +17,34 @@ package com.itsaky.androidide.editor.language.incremental; -import static com.itsaky.androidide.editor.language.incremental.LineState.INCOMPLETE; -import static com.itsaky.androidide.editor.language.incremental.LineState.NORMAL; import static com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.FIXME_COMMENT; import static com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.TODO_COMMENT; import static com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE.withoutCompletion; import androidx.annotation.NonNull; - import com.blankj.utilcode.util.ArrayUtils; import com.google.common.base.Preconditions; import com.google.common.collect.EvictingQueue; import com.itsaky.androidide.editor.language.java.JavaAnalyzer; import com.itsaky.androidide.syntax.colorschemes.SchemeAndroidIDE; import com.itsaky.androidide.utils.CharSequenceReader; -import com.itsaky.androidide.utils.ILogger; - -import org.antlr.v4.runtime.CharStream; -import org.antlr.v4.runtime.CharStreams; -import org.antlr.v4.runtime.Lexer; -import org.antlr.v4.runtime.Token; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Stack; -import java.util.stream.Collectors; - import io.github.rosemoe.sora.lang.analysis.AsyncIncrementalAnalyzeManager; import io.github.rosemoe.sora.lang.styling.CodeBlock; import io.github.rosemoe.sora.lang.styling.Span; import io.github.rosemoe.sora.lang.styling.TextStyle; import io.github.rosemoe.sora.text.Content; import io.github.rosemoe.sora.util.IntPair; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Stack; +import java.util.stream.Collectors; import kotlin.Pair; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.Token; /** * Base class for implementing an {@link AsyncIncrementalAnalyzeManager} in AndroidIDE. @@ -59,9 +52,8 @@ import kotlin.Pair; * @author Akash Yadav */ public abstract class BaseIncrementalAnalyzeManager - extends AsyncIncrementalAnalyzeManager { + extends AsyncIncrementalAnalyzeManager { - private static final ILogger LOG = ILogger.newInstance("BaseIncrementalAnalyzeManager"); protected final Lexer lexer; private final int[] multilineStartTypes; private final int[] multilineEndTypes; @@ -76,7 +68,13 @@ public abstract class BaseIncrementalAnalyzeManager this.multilineStartTypes = multilineTokenTypes[0]; this.multilineEndTypes = multilineTokenTypes[1]; - this.blockTokens = Objects.requireNonNullElseGet(getCodeBlockTokens(), () -> new int[] {}); + + var tokens = getCodeBlockTokens(); + if (tokens == null) { + tokens = new int[0]; + } + + this.blockTokens = tokens; } @NonNull @@ -104,7 +102,7 @@ public abstract class BaseIncrementalAnalyzeManager private void verifyMultilineTypes(@NonNull final int[][] types) { Preconditions.checkState( - types.length == 2, "There must be exact two inner int[] in multiline token types"); + types.length == 2, "There must be exact two inner int[] in multiline token types"); final var start = types[0]; final var end = types[1]; @@ -116,9 +114,9 @@ public abstract class BaseIncrementalAnalyzeManager * Returns the token types which start and end a multiline token. * * @return A 2xn matrix where int[] at index 0 specifies token types which start a - * multiline token and int[] 1 specifies tokens which end the multiline token. For example, - *

[['/', '*'], ['*', '/']]. - *

But instead of characters, there must be token types. + * multiline token and int[] 1 specifies tokens which end the multiline token. For example, + *

[['/', '*'], ['*', '/']]. + *

But instead of characters, there must be token types. * @see JavaAnalyzer */ protected abstract int[][] getMultilineTokenStartEndTypes(); @@ -142,7 +140,7 @@ public abstract class BaseIncrementalAnalyzeManager @Override public LineTokenizeResult tokenizeLine( - final CharSequence lineText, final LineState state, final int line) { + final CharSequence lineText, final LineState state, final int line) { final var tokens = new ArrayList(); var newState = 0; var stateObj = new LineState(); @@ -153,7 +151,7 @@ public abstract class BaseIncrementalAnalyzeManager newState = IntPair.getFirst(result); if (newState == LineState.NORMAL) { newState = - tokenizeNormal(lineText, IntPair.getSecond(result), tokens, stateObj, state.lexerMode); + tokenizeNormal(lineText, IntPair.getSecond(result), tokens, stateObj, state.lexerMode); } else { newState = LineState.INCOMPLETE; } @@ -165,7 +163,7 @@ public abstract class BaseIncrementalAnalyzeManager @Override public List generateSpansForLine( - final LineTokenizeResult tokens) { + final LineTokenizeResult tokens) { var result = generateSpans(tokens); Objects.requireNonNull(result); @@ -184,13 +182,13 @@ public abstract class BaseIncrementalAnalyzeManager * @return The spans for the tokens. */ protected abstract List generateSpans( - final LineTokenizeResult tokens); + final LineTokenizeResult tokens); @Override public List computeBlocks( - final Content text, - final AsyncIncrementalAnalyzeManager.CodeBlockAnalyzeDelegate - delegate) { + final Content text, + final AsyncIncrementalAnalyzeManager.CodeBlockAnalyzeDelegate + delegate) { final var stack = new Stack(); final var blocks = new ArrayList(); var line = 0; @@ -199,8 +197,8 @@ public abstract class BaseIncrementalAnalyzeManager while (delegate.isNotCancelled() && line < text.getLineCount()) { final var tokens = getState(line); final var checkForIdentifiers = - tokens.state.state == LineState.NORMAL - || (tokens.state.state == LineState.INCOMPLETE && tokens.tokens.size() > 1); + tokens.state.state == LineState.NORMAL + || (tokens.state.state == LineState.INCOMPLETE && tokens.tokens.size() > 1); if (!tokens.state.hasBraces && !checkForIdentifiers) { line++; continue; @@ -208,7 +206,6 @@ public abstract class BaseIncrementalAnalyzeManager for (int i = 0; i < tokens.tokens.size(); i++) { final var token = tokens.tokens.get(i); - final var type = token.getType(); var offset = token.getStartIndex(); if (isCodeBlockStart(token)) { if (stack.isEmpty()) { @@ -283,15 +280,15 @@ public abstract class BaseIncrementalAnalyzeManager *

By default, this method removes only the last token. * * @param incompleteToken The token which is the start of the incomplete token. - * @param tokens The list of tokens from which extra tokens must be removed. + * @param tokens The list of tokens from which extra tokens must be removed. */ protected void popTokensAfterIncomplete( - @NonNull IncrementalToken incompleteToken, @NonNull List tokens) { + @NonNull IncrementalToken incompleteToken, @NonNull List tokens) { tokens.remove(tokens.size() - 1); } protected void handleLineCommentSpan( - @NonNull IncrementalToken token, @NonNull List spans, int offset) { + @NonNull IncrementalToken token, @NonNull List spans, int offset) { var commentType = SchemeAndroidIDE.COMMENT; // highlight special line comments @@ -309,23 +306,23 @@ public abstract class BaseIncrementalAnalyzeManager } /** - * Called when the state in {@link #tokenizeLine(CharSequence, LineState)} is {@link - * LineState#NORMAL}. + * Called when the state in {@link #tokenizeLine(CharSequence, LineState)} is + * {@link LineState#NORMAL}. * - * @param line The line source. + * @param line The line source. * @param column The column in line. * @param tokens The list of tokens that must be updated as the line is scanned. - * @param st The state object whose state must be after after the line has been - * scanned. + * @param st The state object whose state must be after after the line has been + * scanned. * @return The new state. */ @SuppressWarnings("UnstableApiUsage") protected int tokenizeNormal( - final CharSequence line, - final int column, - final List tokens, - final LineState st, - final int lexerMode) { + final CharSequence line, + final int column, + final List tokens, + final LineState st, + final int lexerMode) { lexer.setInputStream(createStream(line)); if (lexer._mode != lexerMode) { lexer.pushMode(lexerMode); @@ -390,16 +387,16 @@ public abstract class BaseIncrementalAnalyzeManager } /** - * Called when the state in {@link #tokenizeLine(CharSequence, LineState)} is {@link - * LineState#INCOMPLETE}. + * Called when the state in {@link #tokenizeLine(CharSequence, LineState)} is + * {@link LineState#INCOMPLETE}. * - * @param line The line source. + * @param line The line source. * @param tokens The list of tokens that must be updated as the line is scanned. * @return The state and offset. */ @SuppressWarnings("UnstableApiUsage") protected long fillIncomplete( - CharSequence line, final List tokens, final int lexerMode) { + CharSequence line, final List tokens, final int lexerMode) { lexer.setInputStream(createStream(line)); if (lexer._mode != lexerMode) { lexer.pushMode(lexerMode); @@ -407,7 +404,7 @@ public abstract class BaseIncrementalAnalyzeManager final var queue = createEvictingQueueForTokens(); final var end = queue.getSecond(); final var allTokens = - lexer.getAllTokens().stream().map(IncrementalToken::new).collect(Collectors.toList()); + lexer.getAllTokens().stream().map(IncrementalToken::new).collect(Collectors.toList()); if (allTokens.isEmpty()) { return IntPair.pack(LineState.INCOMPLETE, 0); } @@ -441,15 +438,15 @@ public abstract class BaseIncrementalAnalyzeManager @SuppressWarnings("UnstableApiUsage") @NonNull private Pair, EvictingQueue> - createEvictingQueueForTokens() { + createEvictingQueueForTokens() { return new Pair<>( - EvictingQueue.create(multilineStartTypes.length), - EvictingQueue.create(multilineEndTypes.length)); + EvictingQueue.create(multilineStartTypes.length), + EvictingQueue.create(multilineEndTypes.length)); } @SuppressWarnings("UnstableApiUsage") private boolean matchTokenTypes( - @NonNull int[] types, @NonNull EvictingQueue tokens) { + @NonNull int[] types, @NonNull EvictingQueue tokens) { final var arr = tokens.toArray(new IncrementalToken[0]); for (int i = 0; i < types.length; i++) { if (types[i] != arr[i].getType()) { diff --git a/subprojects/flashbar/src/main/java/com/itsaky/androidide/flashbar/util/CommonUtils.kt b/subprojects/flashbar/src/main/java/com/itsaky/androidide/flashbar/util/CommonUtils.kt index 2801aa39d..004d9a55a 100644 --- a/subprojects/flashbar/src/main/java/com/itsaky/androidide/flashbar/util/CommonUtils.kt +++ b/subprojects/flashbar/src/main/java/com/itsaky/androidide/flashbar/util/CommonUtils.kt @@ -105,11 +105,7 @@ inline fun T.afterMeasured(crossinline f: T.() -> Unit) { object : ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() { if (measuredWidth > 0 && measuredHeight > 0) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - viewTreeObserver.removeOnGlobalLayoutListener(this) - } else { - viewTreeObserver.removeGlobalOnLayoutListener(this) - } + viewTreeObserver.removeOnGlobalLayoutListener(this) f() } } diff --git a/uidesigner/src/main/AndroidManifest.xml b/uidesigner/src/main/AndroidManifest.xml index 750227823..6d5907662 100644 --- a/uidesigner/src/main/AndroidManifest.xml +++ b/uidesigner/src/main/AndroidManifest.xml @@ -17,7 +17,7 @@ - + - - \ No newline at end of file