From 37f10de4aa30b3b191f0badc7881824c10b33a54 Mon Sep 17 00:00:00 2001 From: sebthom Date: Wed, 10 Jul 2024 23:55:39 +0200 Subject: [PATCH] refact: improve null analysis --- .../core/internal/parser/TMParserJSON.java | 4 +-- .../core/internal/utils/NullSafetyHelper.java | 27 +++++++------- .../org/eclipse/tm4e/core/model/TMModel.java | 4 +-- .../internal/model/LanguageConfiguration.java | 12 +++---- .../LanguageConfigurationPreferencePage.java | 4 +-- .../LanguageConfigurationInfoWidget.java | 36 +++++++++---------- ...anguageConfigurationPreferencesWidget.java | 6 ++-- .../LanguageConfigurationImportWizard.java | 6 ++-- ...SelectLanguageConfigurationWizardPage.java | 8 ++--- .../internal/utils/MockDocument.java | 7 ++-- .../ui/internal/hover/TMTokenTextHover.java | 2 +- .../preferences/GrammarPreferencePage.java | 12 +++---- .../preferences/PreferenceHelper.java | 6 ++-- .../preferences/TaskTagsPreferencePage.java | 10 +++--- .../preferences/TextMatePreferencePage.java | 4 +-- .../preferences/ThemePreferencePage.java | 6 ++-- .../tm4e/ui/internal/snippets/Snippet.java | 6 ++-- ...TMPresentationReconcilerTestGenerator.java | 6 ++-- .../tm4e/ui/internal/themes/ThemeManager.java | 2 +- .../tm4e/ui/internal/widgets/TMViewer.java | 4 ++- .../wizards/CreateThemeAssociationWizard.java | 4 +-- .../CreateThemeAssociationWizardPage.java | 10 +++--- .../wizards/SelectGrammarWizardPage.java | 6 ++-- .../wizards/TextMateGrammarImportWizard.java | 6 ++-- .../ui/text/TMPresentationReconciler.java | 4 +-- .../org/eclipse/tm4e/ui/themes/Theme.java | 6 ++-- .../tm4e/ui/themes/ThemeAssociation.java | 6 ++-- pom.xml | 2 +- 28 files changed, 109 insertions(+), 107 deletions(-) diff --git a/org.eclipse.tm4e.core/src/main/java/org/eclipse/tm4e/core/internal/parser/TMParserJSON.java b/org.eclipse.tm4e.core/src/main/java/org/eclipse/tm4e/core/internal/parser/TMParserJSON.java index 4f2c7d8d6..b7013e0c2 100644 --- a/org.eclipse.tm4e.core/src/main/java/org/eclipse/tm4e/core/internal/parser/TMParserJSON.java +++ b/org.eclipse.tm4e.core/src/main/java/org/eclipse/tm4e/core/internal/parser/TMParserJSON.java @@ -12,7 +12,7 @@ */ package org.eclipse.tm4e.core.internal.parser; -import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.assertNonNull; +import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.castNonNull; import java.io.BufferedReader; import java.io.Reader; @@ -53,7 +53,7 @@ protected TMParserJSON() { protected Map loadRaw(final Reader source) { // GSON does not support trailing commas so we have to manually remove them -> maybe better switch to jackson json parser? final var jsonString = removeTrailingCommas(new BufferedReader(source).lines().collect(Collectors.joining("\n"))); - return assertNonNull(LOADER.fromJson(jsonString, Map.class)); + return castNonNull(LOADER.fromJson(jsonString, Map.class)); } @Override diff --git a/org.eclipse.tm4e.core/src/main/java/org/eclipse/tm4e/core/internal/utils/NullSafetyHelper.java b/org.eclipse.tm4e.core/src/main/java/org/eclipse/tm4e/core/internal/utils/NullSafetyHelper.java index 615ba3962..294dbc7ba 100644 --- a/org.eclipse.tm4e.core/src/main/java/org/eclipse/tm4e/core/internal/utils/NullSafetyHelper.java +++ b/org.eclipse.tm4e.core/src/main/java/org/eclipse/tm4e/core/internal/utils/NullSafetyHelper.java @@ -19,28 +19,28 @@ public final class NullSafetyHelper { - public static @NonNull T assertNonNull(final @Nullable T value) { - if (value == null) - throw new IllegalStateException("Null value!"); - return value; - } - /** - * Casts non-null value marked as {@link Nullable} to {@link NonNull}. + * Casts a non-null value marked as {@link Nullable} to {@link NonNull}. *

* Only use if you are sure the value is non-null but annotation-based null analysis was not able to determine it. *

* This method is not meant for non-null input validation. * - * @throws AssertionError if JVM assertions are enabled and the given value is null + * @throws IllegalStateException if the given value is null */ public static @NonNull T castNonNull(final @Nullable T value) { - assert value != null; + if (value == null) + throw new IllegalStateException("Unexpected null value present!"); return value; } + /** + * Casts the elements of given array to {@link NonNull} without any validation. + *

+ * Only use if you are sure the value is non-null but annotation-based null analysis was not able to determine it. + */ @SuppressWarnings("null") - private static @NonNull T castNonNullUnsafe(final T value) { + public static @NonNull T castNonNullUnsafe(final T value) { return value; } @@ -58,7 +58,7 @@ public static T defaultIfNull(final @Nullable T object, final T defaultValue return object; } - public static T defaultIfNull(@Nullable final T object, final Supplier defaultValue) { + public static T defaultIfNull(final @Nullable T object, final Supplier defaultValue) { if (object == null) { return defaultValue.get(); } @@ -66,10 +66,11 @@ public static T defaultIfNull(@Nullable final T object, final Supplier de } /** - * Allows to initializes a @NonNull field with null that is lazy initialized + * Allows to initializes a @NonNull field with null that is + * initialized later. */ @SuppressWarnings("unchecked") - public static @NonNull T lazyNonNull() { + public static @NonNull T lateNonNull() { return (T) castNonNullUnsafe(null); } diff --git a/org.eclipse.tm4e.core/src/main/java/org/eclipse/tm4e/core/model/TMModel.java b/org.eclipse.tm4e.core/src/main/java/org/eclipse/tm4e/core/model/TMModel.java index 4f7b6a1aa..27fbd2c7b 100644 --- a/org.eclipse.tm4e.core/src/main/java/org/eclipse/tm4e/core/model/TMModel.java +++ b/org.eclipse.tm4e.core/src/main/java/org/eclipse/tm4e/core/model/TMModel.java @@ -15,7 +15,7 @@ package org.eclipse.tm4e.core.model; import static java.lang.System.Logger.Level.*; -import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lazyNonNull; +import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lateNonNull; import java.lang.System.Logger; import java.time.Duration; @@ -99,7 +99,7 @@ public String toString() { /** The background thread performing async line tokenizations */ private volatile @Nullable TokenizerThread tokenizerThread; private volatile boolean tokenizerThreadHasWork; - private TMTokenizationSupport tokenizer = lazyNonNull(); + private TMTokenizationSupport tokenizer = lateNonNull(); /** package visibility for tests **/ final ArrayList lines; diff --git a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/model/LanguageConfiguration.java b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/model/LanguageConfiguration.java index 2197c3d86..b58bcb231 100644 --- a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/model/LanguageConfiguration.java +++ b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/model/LanguageConfiguration.java @@ -267,7 +267,7 @@ private static String removeTrailingCommas(final String jsonString) { .create(); try { - final var langCfg = assertNonNull(gsonBuilder.fromJson(jsonString, LanguageConfiguration.class)); + final var langCfg = castNonNull(gsonBuilder.fromJson(jsonString, LanguageConfiguration.class)); if (castNullable(langCfg.autoClosingPairs) == null) { langCfg.autoClosingPairs = Collections.emptyList(); } else { @@ -364,7 +364,7 @@ private static boolean getAsBoolean(final @Nullable JsonElement element, final b return comments; } - private List brackets = lazyNonNull(); + private List brackets = lateNonNull(); /** * Returns the language's brackets. This configuration implicitly affects pressing Enter around these brackets. @@ -395,7 +395,7 @@ public List getBrackets() { return indentationRules; } - private List onEnterRules = lazyNonNull(); + private List onEnterRules = lateNonNull(); /** * Returns the language's rules to be evaluated when pressing Enter. @@ -406,7 +406,7 @@ public List getOnEnterRules() { return onEnterRules; } - private List autoClosingPairs = lazyNonNull(); + private List autoClosingPairs = lateNonNull(); /** * Returns the language's auto closing pairs. The 'close' character is automatically inserted with the 'open' @@ -418,7 +418,7 @@ public List getAutoClosingPairs() { return autoClosingPairs; } - private List surroundingPairs = lazyNonNull(); + private List surroundingPairs = lateNonNull(); /** * Returns the language's surrounding pairs. When the 'open' character is typed on a selection, the selected string @@ -430,7 +430,7 @@ public List getSurroundingPairs() { return surroundingPairs; } - private List colorizedBracketPairs = lazyNonNull(); + private List colorizedBracketPairs = lateNonNull(); /** * Defines a list of bracket pairs that are colorized depending on their nesting level. diff --git a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/preferences/LanguageConfigurationPreferencePage.java b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/preferences/LanguageConfigurationPreferencePage.java index fcc14460f..34bc9cce9 100644 --- a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/preferences/LanguageConfigurationPreferencePage.java +++ b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/preferences/LanguageConfigurationPreferencePage.java @@ -13,7 +13,7 @@ */ package org.eclipse.tm4e.languageconfiguration.internal.preferences; -import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lazyNonNull; +import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lateNonNull; import static org.eclipse.tm4e.languageconfiguration.internal.LanguageConfigurationMessages.*; import org.eclipse.jdt.annotation.NonNullByDefault; @@ -46,7 +46,7 @@ public final class LanguageConfigurationPreferencePage extends AbstractPreferenc static final String PAGE_ID = "org.eclipse.tm4e.languageconfiguration.preferences.LanguageConfigurationPreferencePage"; //$NON-NLS-1$ private ILanguageConfigurationRegistryManager.EditSession manager = LanguageConfigurationRegistryManager.getInstance().newEditSession(); - private TableWidget langCfgsTable = lazyNonNull(); + private TableWidget langCfgsTable = lateNonNull(); public LanguageConfigurationPreferencePage() { super(LanguageConfigurationPreferencePage_title, LanguageConfigurationPreferencePage_description); diff --git a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/LanguageConfigurationInfoWidget.java b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/LanguageConfigurationInfoWidget.java index ce9e8f210..805a5de9b 100644 --- a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/LanguageConfigurationInfoWidget.java +++ b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/LanguageConfigurationInfoWidget.java @@ -11,7 +11,7 @@ */ package org.eclipse.tm4e.languageconfiguration.internal.widgets; -import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lazyNonNull; +import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lateNonNull; import static org.eclipse.tm4e.languageconfiguration.internal.LanguageConfigurationMessages.*; import java.util.List; @@ -52,32 +52,32 @@ public class LanguageConfigurationInfoWidget extends Composite { LanguageConfigurationInfoWidget_colorizedBracketPairs_title, }; - private Text lineCommentText = lazyNonNull(); - private Text blockCommentStartText = lazyNonNull(); - private Text blockCommentEndText = lazyNonNull(); + private Text lineCommentText = lateNonNull(); + private Text blockCommentStartText = lateNonNull(); + private Text blockCommentEndText = lateNonNull(); - private CharacterPairsTableWidget bracketsTable = lazyNonNull(); + private CharacterPairsTableWidget bracketsTable = lateNonNull(); - private AutoClosingPairConditionalTableWidget autoClosingPairsTable = lazyNonNull(); + private AutoClosingPairConditionalTableWidget autoClosingPairsTable = lateNonNull(); - private Text autoCloseBeforeText = lazyNonNull(); + private Text autoCloseBeforeText = lateNonNull(); - private CharacterPairsTableWidget surroundingPairsTable = lazyNonNull(); + private CharacterPairsTableWidget surroundingPairsTable = lateNonNull(); - private Text foldingOffsideText = lazyNonNull(); - private Text foldingMarkersStartText = lazyNonNull(); - private Text foldingMarkersEndText = lazyNonNull(); + private Text foldingOffsideText = lateNonNull(); + private Text foldingMarkersStartText = lateNonNull(); + private Text foldingMarkersEndText = lateNonNull(); - private Text wordPatternText = lazyNonNull(); + private Text wordPatternText = lateNonNull(); - private OnEnterRuleTableWidget onEnterRuleTable = lazyNonNull(); + private OnEnterRuleTableWidget onEnterRuleTable = lateNonNull(); - private Text indentationDecreaseIndentPattern = lazyNonNull(); - private Text indentationIncreaseIndentPattern = lazyNonNull(); - private Text indentationIndentNextLinePattern = lazyNonNull(); - private Text indentationUnIndentedLinePattern = lazyNonNull(); + private Text indentationDecreaseIndentPattern = lateNonNull(); + private Text indentationIncreaseIndentPattern = lateNonNull(); + private Text indentationIndentNextLinePattern = lateNonNull(); + private Text indentationUnIndentedLinePattern = lateNonNull(); - private CharacterPairsTableWidget colorizedBracketPairsTable = lazyNonNull(); + private CharacterPairsTableWidget colorizedBracketPairsTable = lateNonNull(); public LanguageConfigurationInfoWidget(final Composite parent, final int style) { super(parent, style); diff --git a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/LanguageConfigurationPreferencesWidget.java b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/LanguageConfigurationPreferencesWidget.java index 1ae3099f3..3da88804e 100644 --- a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/LanguageConfigurationPreferencesWidget.java +++ b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/widgets/LanguageConfigurationPreferencesWidget.java @@ -12,7 +12,7 @@ package org.eclipse.tm4e.languageconfiguration.internal.widgets; import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter; -import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lazyNonNull; +import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lateNonNull; import static org.eclipse.tm4e.languageconfiguration.internal.LanguageConfigurationMessages.*; import org.eclipse.jdt.annotation.NonNullByDefault; @@ -31,8 +31,8 @@ public final class LanguageConfigurationPreferencesWidget extends LanguageConfig private @NonNullByDefault({}) Button toggleBracketAutoClosingButton; private @NonNullByDefault({}) Button toggleMatchingPairsButton; - private ILanguageConfigurationDefinition definition = lazyNonNull(); - private ILanguageConfigurationRegistryManager.EditSession manager = lazyNonNull(); + private ILanguageConfigurationDefinition definition = lateNonNull(); + private ILanguageConfigurationRegistryManager.EditSession manager = lateNonNull(); public LanguageConfigurationPreferencesWidget(final Composite parent, final int style) { super(parent, style); diff --git a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/wizards/LanguageConfigurationImportWizard.java b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/wizards/LanguageConfigurationImportWizard.java index 3f7305ecc..c68d1184b 100644 --- a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/wizards/LanguageConfigurationImportWizard.java +++ b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/wizards/LanguageConfigurationImportWizard.java @@ -11,7 +11,7 @@ */ package org.eclipse.tm4e.languageconfiguration.internal.wizards; -import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lazyNonNull; +import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lateNonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jface.viewers.IStructuredSelection; @@ -31,8 +31,8 @@ public final class LanguageConfigurationImportWizard extends Wizard implements I private final ILanguageConfigurationRegistryManager.EditSession manager; private final boolean saveOnFinish; - private SelectLanguageConfigurationWizardPage mainPage = lazyNonNull(); - private ILanguageConfigurationDefinition createdDefinition = lazyNonNull(); + private SelectLanguageConfigurationWizardPage mainPage = lateNonNull(); + private ILanguageConfigurationDefinition createdDefinition = lateNonNull(); public LanguageConfigurationImportWizard(final ILanguageConfigurationRegistryManager.EditSession manager, final boolean saveOnFinish) { this.manager = manager; diff --git a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/wizards/SelectLanguageConfigurationWizardPage.java b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/wizards/SelectLanguageConfigurationWizardPage.java index 846b3eb3f..b425f5c7c 100644 --- a/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/wizards/SelectLanguageConfigurationWizardPage.java +++ b/org.eclipse.tm4e.languageconfiguration/src/main/java/org/eclipse/tm4e/languageconfiguration/internal/wizards/SelectLanguageConfigurationWizardPage.java @@ -63,9 +63,9 @@ final class SelectLanguageConfigurationWizardPage extends WizardPage implements private static final String[] TEXTMATE_EXTENSIONS = { "*language-configuration.json" }; //$NON-NLS-1$ - private Text fileText = lazyNonNull(); - private Text contentTypeText = lazyNonNull(); - private LanguageConfigurationInfoWidget infoWidget = lazyNonNull(); + private Text fileText = lateNonNull(); + private Text contentTypeText = lateNonNull(); + private LanguageConfigurationInfoWidget infoWidget = lateNonNull(); private final ILanguageConfigurationRegistryManager registryManager; @@ -306,7 +306,7 @@ ILanguageConfigurationDefinition getDefinition() { path = castNonNull(ResourcesPlugin.getWorkspace().getRoot().getFile(path).getLocation()); } - final var contentType = assertNonNull(ContentTypeHelper.getContentTypeById(contentTypeText.getText())); + final var contentType = castNonNull(ContentTypeHelper.getContentTypeById(contentTypeText.getText())); return new LanguageConfigurationDefinition(contentType, path.toString()); } } diff --git a/org.eclipse.tm4e.languageconfiguration/src/test/java/org/eclipse/tm4e/languageconfiguration/internal/utils/MockDocument.java b/org.eclipse.tm4e.languageconfiguration/src/test/java/org/eclipse/tm4e/languageconfiguration/internal/utils/MockDocument.java index c43491729..f305af794 100644 --- a/org.eclipse.tm4e.languageconfiguration/src/test/java/org/eclipse/tm4e/languageconfiguration/internal/utils/MockDocument.java +++ b/org.eclipse.tm4e.languageconfiguration/src/test/java/org/eclipse/tm4e/languageconfiguration/internal/utils/MockDocument.java @@ -16,7 +16,7 @@ import java.io.LineNumberReader; import java.io.StringReader; -import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.DefaultLineTracker; import org.eclipse.jface.text.IDocument; @@ -33,7 +33,6 @@ * Partially implemented {@link IDocument}. Especially all methods related to {@link IDocumentListener}, {@link IDocumentPartitioner}, * {@link Position} are not implemented. */ -@NonNullByDefault({}) public class MockDocument implements IDocument { private String contentType; @@ -164,7 +163,7 @@ public int getLength() { } @Override - public String getLineDelimiter(final int lineIndex) throws BadLocationException { + public @Nullable String getLineDelimiter(final int lineIndex) throws BadLocationException { final String[] lines = text.split("\n"); if (lines.length <= lineIndex) throw new BadLocationException("Line " + lineIndex + " not present."); @@ -305,7 +304,7 @@ public void set(final String text) { } @Override - public void setDocumentPartitioner(IDocumentPartitioner partitioner) { + public void setDocumentPartitioner(@Nullable IDocumentPartitioner partitioner) { throw new UnsupportedOperationException(); } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/hover/TMTokenTextHover.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/hover/TMTokenTextHover.java index 9e7711581..3507f5e2c 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/hover/TMTokenTextHover.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/hover/TMTokenTextHover.java @@ -44,7 +44,7 @@ private static final class RegionWithTMToken extends Region { } @Override - public IInformationControlCreator getHoverControlCreator() { + public @Nullable IInformationControlCreator getHoverControlCreator() { // setup a hover control that interprets basic HTML input return new AbstractReusableInformationControlCreator() { @Override diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/GrammarPreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/GrammarPreferencePage.java index b40d62d5d..d9c741bbb 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/GrammarPreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/GrammarPreferencePage.java @@ -13,7 +13,7 @@ *******************************************************************************/ package org.eclipse.tm4e.ui.internal.preferences; -import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lazyNonNull; +import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lateNonNull; import java.util.stream.Collectors; @@ -65,14 +65,14 @@ public final class GrammarPreferencePage extends AbstractPreferencePage { private IThemeManager.EditSession themeManager = ThemeManager.getInstance().newEditSession(); private final ISnippetManager snippetManager = TMUIPlugin.getSnippetManager(); - private TableWidget grammarsTable = lazyNonNull(); + private TableWidget grammarsTable = lateNonNull(); // Grammar info tabs - private GrammarInfoWidget grammarInfoWidget = lazyNonNull(); - private TableWithControlsWidget contentTypesWidget = lazyNonNull(); - private ThemeAssociationsWidget themeAssociationsWidget = lazyNonNull(); + private GrammarInfoWidget grammarInfoWidget = lateNonNull(); + private TableWithControlsWidget contentTypesWidget = lateNonNull(); + private ThemeAssociationsWidget themeAssociationsWidget = lateNonNull(); - private TMViewer grammarPreview = lazyNonNull(); + private TMViewer grammarPreview = lateNonNull(); public GrammarPreferencePage() { super(TMUIMessages.GrammarPreferencePage_title, TMUIMessages.GrammarPreferencePage_description); diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/PreferenceHelper.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/PreferenceHelper.java index f88564d0d..17ba87ae3 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/PreferenceHelper.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/PreferenceHelper.java @@ -66,7 +66,7 @@ public void write(final JsonWriter out, final @Nullable MarkerConfig value) thro @Override public @Nullable MarkerConfig read(final JsonReader in) throws IOException { - final var objectJson = assertNonNull(jsonElementAdapter.read(in)).getAsJsonObject(); + final var objectJson = castNonNull(jsonElementAdapter.read(in)).getAsJsonObject(); return switch (MarkerConfig.Type.valueOf(objectJson.get("type").getAsString())) { case PROBLEM -> problemAdapter.fromJsonTree(objectJson); case TASK -> taskAdapter.fromJsonTree(objectJson); @@ -77,7 +77,7 @@ public void write(final JsonWriter out, final @Nullable MarkerConfig value) thro }).create(); public static IThemeAssociation[] loadThemeAssociations(final String json) { - return assertNonNull(DEFAULT_GSON.fromJson(json, ThemeAssociation[].class)); + return castNonNull(DEFAULT_GSON.fromJson(json, ThemeAssociation[].class)); } public static String toJsonThemeAssociations(final Collection themeAssociations) { @@ -97,7 +97,7 @@ public static Set loadMarkerConfigs() { } public static Set loadMarkerConfigs(final String json) { - return assertNonNull(DEFAULT_GSON.fromJson(json, new TypeToken>() { + return castNonNull(DEFAULT_GSON.fromJson(json, new TypeToken>() { }.getType())); } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/TaskTagsPreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/TaskTagsPreferencePage.java index c4ab5efce..1d02de57b 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/TaskTagsPreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/TaskTagsPreferencePage.java @@ -58,10 +58,10 @@ private static final class MarkerConfigEditDialog extends TitleAreaDialog { @Nullable MarkerConfig markerConfig; - Text txtTag = lazyNonNull(); - Combo cmbType = lazyNonNull(); - Label lblLevel = lazyNonNull(); - Combo cmbLevel = lazyNonNull(); + Text txtTag = lateNonNull(); + Combo cmbType = lateNonNull(); + Label lblLevel = lateNonNull(); + Combo cmbLevel = lateNonNull(); MarkerConfigEditDialog(final Shell parentShell, final @Nullable MarkerConfig markerConfig) { super(parentShell); @@ -174,7 +174,7 @@ public boolean isHelpAvailable() { } private final Set markerConfigs = PreferenceHelper.loadMarkerConfigs(); - private TableWidget markerConfigsTable = lazyNonNull(); + private TableWidget markerConfigsTable = lateNonNull(); public TaskTagsPreferencePage() { super(null, TMUIMessages.TaskTagsPreferencePage_description); diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/TextMatePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/TextMatePreferencePage.java index fd1ebed61..5a84381bb 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/TextMatePreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/TextMatePreferencePage.java @@ -11,7 +11,7 @@ */ package org.eclipse.tm4e.ui.internal.preferences; -import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lazyNonNull; +import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lateNonNull; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.layout.GridLayoutFactory; @@ -33,7 +33,7 @@ */ public final class TextMatePreferencePage extends AbstractPreferencePage { - private Button tmTokenHoverCheckbox = lazyNonNull(); + private Button tmTokenHoverCheckbox = lateNonNull(); public TextMatePreferencePage() { super(null, null); diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/ThemePreferencePage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/ThemePreferencePage.java index 3ff5ae970..19569bb66 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/ThemePreferencePage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/preferences/ThemePreferencePage.java @@ -65,11 +65,11 @@ public final class ThemePreferencePage extends AbstractPreferencePage { private final IGrammarRegistryManager grammarManager = TMEclipseRegistryPlugin.getGrammarRegistryManager(); private IThemeManager.EditSession themeManager = ThemeManager.getInstance().newEditSession(); - private TableWidget themesTable = lazyNonNull(); + private TableWidget themesTable = lateNonNull(); // Preview content - private ComboViewer grammarsCombo = lazyNonNull(); - private TMViewer themePreview = lazyNonNull(); + private ComboViewer grammarsCombo = lateNonNull(); + private TMViewer themePreview = lateNonNull(); public ThemePreferencePage() { super(TMUIMessages.ThemePreferencePage_title, TMUIMessages.ThemePreferencePage_description); diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/snippets/Snippet.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/snippets/Snippet.java index 3b2aec0e4..5e96bbb05 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/snippets/Snippet.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/snippets/Snippet.java @@ -11,7 +11,7 @@ */ package org.eclipse.tm4e.ui.internal.snippets; -import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.assertNonNull; +import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.castNonNull; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.tm4e.registry.TMResource; @@ -33,8 +33,8 @@ final class Snippet extends TMResource implements ISnippet { Snippet(final IConfigurationElement ce) { super(ce); - this.scopeName = assertNonNull(ce.getAttribute(XMLConstants.SCOPE_NAME_ATTR)); - this.name = assertNonNull(ce.getAttribute(XMLConstants.NAME_ATTR)); + this.scopeName = castNonNull(ce.getAttribute(XMLConstants.SCOPE_NAME_ATTR)); + this.name = castNonNull(ce.getAttribute(XMLConstants.NAME_ATTR)); } @Override diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/text/TMPresentationReconcilerTestGenerator.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/text/TMPresentationReconcilerTestGenerator.java index 3963d2fce..7d6c5d158 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/text/TMPresentationReconcilerTestGenerator.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/text/TMPresentationReconcilerTestGenerator.java @@ -11,7 +11,7 @@ */ package org.eclipse.tm4e.ui.internal.text; -import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lazyNonNull; +import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lateNonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jface.text.DocumentEvent; @@ -26,8 +26,8 @@ public final class TMPresentationReconcilerTestGenerator implements ITMPresentationReconcilerListener, IDocumentListener, ITextListener { - private ITextViewer viewer = lazyNonNull(); - private IDocument document = lazyNonNull(); + private ITextViewer viewer = lateNonNull(); + private IDocument document = lateNonNull(); private final StringBuilder code = new StringBuilder(); diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/themes/ThemeManager.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/themes/ThemeManager.java index f34a897c1..8cd2ab41a 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/themes/ThemeManager.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/themes/ThemeManager.java @@ -148,7 +148,7 @@ private void loadThemesFromPreferences() { void save() throws BackingStoreException { // save config to "${workspace_loc}/metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.tm4e.ui.prefs" - final var prefs = castNonNull(InstanceScope.INSTANCE.getNode(TMUIPlugin.PLUGIN_ID)); + final var prefs = InstanceScope.INSTANCE.getNode(TMUIPlugin.PLUGIN_ID); // manually registered themes prefs.put(PreferenceConstants.THEMES, Arrays.stream(getThemes()) // diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/widgets/TMViewer.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/widgets/TMViewer.java index 880fab7dc..5cd252428 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/widgets/TMViewer.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/widgets/TMViewer.java @@ -11,6 +11,8 @@ */ package org.eclipse.tm4e.ui.internal.widgets; +import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.castNonNull; + import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.text.Document; @@ -70,6 +72,6 @@ public void setText(final String text) { if (getDocument() == null) { setDocument(new Document()); } - getDocument().set(text); + castNonNull(getDocument()).set(text); } } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/wizards/CreateThemeAssociationWizard.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/wizards/CreateThemeAssociationWizard.java index e3f80961e..30eee3e3b 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/wizards/CreateThemeAssociationWizard.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/wizards/CreateThemeAssociationWizard.java @@ -11,7 +11,7 @@ */ package org.eclipse.tm4e.ui.internal.wizards; -import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lazyNonNull; +import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lateNonNull; import org.eclipse.jdt.annotation.Nullable; import org.eclipse.jface.wizard.Wizard; @@ -29,7 +29,7 @@ public final class CreateThemeAssociationWizard extends Wizard { private final IThemeManager.EditSession themeManager; private final boolean saveOnFinish; - private CreateThemeAssociationWizardPage mainPage = lazyNonNull(); + private CreateThemeAssociationWizardPage mainPage = lateNonNull(); private @Nullable IThemeAssociation createdThemeAssociation; private @Nullable IGrammarDefinition initialDefinition; private @Nullable IThemeAssociation initialAssociation; diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/wizards/CreateThemeAssociationWizardPage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/wizards/CreateThemeAssociationWizardPage.java index 022835781..37e7f0a34 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/wizards/CreateThemeAssociationWizardPage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/wizards/CreateThemeAssociationWizardPage.java @@ -43,8 +43,8 @@ final class CreateThemeAssociationWizardPage extends AbstractWizardPage { private static final String PAGE_NAME = CreateThemeAssociationWizardPage.class.getName(); - private ComboViewer themeViewer = lazyNonNull(); - private ComboViewer grammarsCombo = lazyNonNull(); + private ComboViewer themeViewer = lateNonNull(); + private ComboViewer grammarsCombo = lateNonNull(); @Nullable private final IGrammarDefinition initialDefinition; @@ -52,7 +52,7 @@ final class CreateThemeAssociationWizardPage extends AbstractWizardPage { @Nullable private final IThemeAssociation initialAssociation; - private Button whenDarkButton = lazyNonNull(); + private Button whenDarkButton = lateNonNull(); protected CreateThemeAssociationWizardPage(@Nullable final IGrammarDefinition initialDefinition, @Nullable final IThemeAssociation initialAssociation) { @@ -130,8 +130,8 @@ protected IStatus validatePage(final Event event) { } IThemeAssociation getThemeAssociation() { - final String themeId = ((ITheme) assertNonNull(themeViewer.getStructuredSelection().getFirstElement())).getId(); - final var grammar = (IGrammarDefinition) assertNonNull(grammarsCombo.getStructuredSelection().getFirstElement()); + final String themeId = ((ITheme) castNonNull(themeViewer.getStructuredSelection().getFirstElement())).getId(); + final var grammar = (IGrammarDefinition) castNonNull(grammarsCombo.getStructuredSelection().getFirstElement()); final String scopeName = grammar.getScope().getName(); final boolean whenDark = whenDarkButton.getSelection(); return new ThemeAssociation(themeId, scopeName, whenDark); diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/wizards/SelectGrammarWizardPage.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/wizards/SelectGrammarWizardPage.java index 9e73a4bbe..c426fdf5a 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/wizards/SelectGrammarWizardPage.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/wizards/SelectGrammarWizardPage.java @@ -65,8 +65,8 @@ final class SelectGrammarWizardPage extends AbstractWizardPage { "*.yaml", "*.yml" }; - private Text grammarFileText = lazyNonNull(); - private GrammarInfoWidget grammarInfoWidget = lazyNonNull(); + private Text grammarFileText = lateNonNull(); + private GrammarInfoWidget grammarInfoWidget = lateNonNull(); protected SelectGrammarWizardPage() { super(PAGE_NAME); @@ -160,7 +160,7 @@ public boolean select(final Viewer viewer, final @Nullable Object parentElement, }); if (dialog.open() == ElementTreeSelectionDialog.OK && dialog.getFirstResult() instanceof final IFile file) { - grammarFileText.setText(assertNonNull(file.getLocation()).toOSString()); + grammarFileText.setText(castNonNull(file.getLocation()).toOSString()); } } }); diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/wizards/TextMateGrammarImportWizard.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/wizards/TextMateGrammarImportWizard.java index a5e5dbced..fadb5437f 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/wizards/TextMateGrammarImportWizard.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/internal/wizards/TextMateGrammarImportWizard.java @@ -11,7 +11,7 @@ */ package org.eclipse.tm4e.ui.internal.wizards; -import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lazyNonNull; +import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.lateNonNull; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.Wizard; @@ -31,8 +31,8 @@ public final class TextMateGrammarImportWizard extends Wizard implements IImport private final IGrammarRegistryManager.EditSession manager; private final boolean saveOnFinish; - private SelectGrammarWizardPage mainPage = lazyNonNull(); - private IGrammarDefinition createdDefinition = lazyNonNull(); + private SelectGrammarWizardPage mainPage = lateNonNull(); + private IGrammarDefinition createdDefinition = lateNonNull(); public TextMateGrammarImportWizard(final IGrammarRegistryManager.EditSession manager, final boolean saveOnFinish) { this.manager = manager; diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/text/TMPresentationReconciler.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/text/TMPresentationReconciler.java index f3cb8cc80..c27484fb0 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/text/TMPresentationReconciler.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/text/TMPresentationReconciler.java @@ -226,8 +226,8 @@ public void inputDocumentChanged(final @Nullable IDocument oldDoc, final @Nullab } @Override - public void textChanged(final @Nullable TextEvent event) { - if (event == null || !event.getViewerRedrawState()) + public void textChanged(final TextEvent event) { + if (!event.getViewerRedrawState()) return; final var viewer = TMPresentationReconciler.this.viewer; diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/themes/Theme.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/themes/Theme.java index f41af8310..05e385577 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/themes/Theme.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/themes/Theme.java @@ -11,7 +11,7 @@ */ package org.eclipse.tm4e.ui.themes; -import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.assertNonNull; +import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.castNonNull; import java.io.InputStream; @@ -70,8 +70,8 @@ public Theme(final String id, final String path, final String name, final boolea */ public Theme(final IConfigurationElement ce) { super(ce); - id = assertNonNull(ce.getAttribute(XMLConstants.ID_ATTR)); - name = assertNonNull(ce.getAttribute(XMLConstants.NAME_ATTR)); + id = castNonNull(ce.getAttribute(XMLConstants.ID_ATTR)); + name = castNonNull(ce.getAttribute(XMLConstants.NAME_ATTR)); dark = Boolean.parseBoolean(ce.getAttribute(DARK_ATTR)); isDefault = Boolean.parseBoolean(ce.getAttribute(DEFAULT_ATTR)); } diff --git a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/themes/ThemeAssociation.java b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/themes/ThemeAssociation.java index 853dda763..6c3324b25 100644 --- a/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/themes/ThemeAssociation.java +++ b/org.eclipse.tm4e.ui/src/main/java/org/eclipse/tm4e/ui/themes/ThemeAssociation.java @@ -11,7 +11,7 @@ */ package org.eclipse.tm4e.ui.themes; -import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.assertNonNull; +import static org.eclipse.tm4e.core.internal.utils.NullSafetyHelper.castNonNull; import java.util.Objects; @@ -54,8 +54,8 @@ public ThemeAssociation(final String themeId, final String scopeName, final bool } public ThemeAssociation(final IConfigurationElement ce) { - this(assertNonNull(ce.getAttribute(THEME_ID_ATTR)), - assertNonNull(ce.getAttribute(SCOPE_NAME_ATTR)), + this(castNonNull(ce.getAttribute(THEME_ID_ATTR)), + castNonNull(ce.getAttribute(SCOPE_NAME_ATTR)), "true".equals(ce.getAttribute(WHEN_DARK_ATTR))); this.pluginId = ce.getNamespaceIdentifier(); } diff --git a/pom.xml b/pom.xml index cbc57c3a5..5830f0ecf 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ com.vegardit.no-npe no-npe-eea-all - 1.0.0 + 1.0.2 provided