Bug 574422: [Variables] Fix possible NPE in checkValue

Change-Id: I808d241689127ef02900897aa818fe91bbe4b59b
diff --git a/ecommons/org.eclipse.statet.ecommons.coremisc/src/org/eclipse/statet/ecommons/variables/core/VariableText2.java b/ecommons/org.eclipse.statet.ecommons.coremisc/src/org/eclipse/statet/ecommons/variables/core/VariableText2.java
index d0fedf1..578f1e1 100644
--- a/ecommons/org.eclipse.statet.ecommons.coremisc/src/org/eclipse/statet/ecommons/variables/core/VariableText2.java
+++ b/ecommons/org.eclipse.statet.ecommons.coremisc/src/org/eclipse/statet/ecommons/variables/core/VariableText2.java
@@ -14,10 +14,7 @@
 
 package org.eclipse.statet.ecommons.variables.core;
 
-import static org.eclipse.statet.jcommons.lang.NullDefaultLocation.PARAMETER;
-import static org.eclipse.statet.jcommons.lang.NullDefaultLocation.RETURN_TYPE;
-import static org.eclipse.statet.jcommons.lang.NullDefaultLocation.TYPE_ARGUMENT;
-import static org.eclipse.statet.jcommons.lang.NullDefaultLocation.TYPE_BOUND;
+import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullAssert;
 import static org.eclipse.statet.jcommons.lang.ObjectUtils.nonNullElse;
 
 import java.util.ArrayList;
@@ -35,7 +32,6 @@
 import org.eclipse.core.variables.VariablesPlugin;
 import org.eclipse.osgi.util.NLS;
 
-import org.eclipse.statet.jcommons.lang.NonNull;
 import org.eclipse.statet.jcommons.lang.NonNullByDefault;
 import org.eclipse.statet.jcommons.lang.Nullable;
 
@@ -105,7 +101,6 @@
 	private static final String RESOLVE_FAILED_VALUE= new String("<unresolved>"); //$NON-NLS-1$
 	
 	
-	@NonNullByDefault({ PARAMETER, RETURN_TYPE, TYPE_BOUND, TYPE_ARGUMENT })
 	private static class VariableReference {
 		
 		/** Offset of '$' */
@@ -115,11 +110,11 @@
 		
 		
 		/** Name of the variable */
-		private final @NonNull String name;
+		private final String name;
 		
-		private IStringVariable variable;
+		private @Nullable IStringVariable variable;
 		
-		private String value;
+		private @Nullable String value;
 		
 		
 		public VariableReference(final int begin, final int end, final String name) {
@@ -251,14 +246,16 @@
 		variable= this.extraVariables.get(name);
 		
 		if (variable == null) {
-			if (this.variableManager == null) {
-				this.variableManager= VariablesPlugin.getDefault().getStringVariableManager();
+			var variableManager= this.variableManager;
+			if (variableManager == null) {
+				variableManager= VariablesPlugin.getDefault().getStringVariableManager();
+				this.variableManager= variableManager;
 			}
 			
-			variable= this.variableManager.getValueVariable(name);
+			variable= variableManager.getValueVariable(name);
 			
 			if (variable == null) {
-				variable= this.variableManager.getDynamicVariable(name);
+				variable= variableManager.getDynamicVariable(name);
 			}
 		}
 		
@@ -375,9 +372,10 @@
 			}
 		}
 		for (final VariableReference ref : this.references) {
-			if (ref.variable != null && ref.hasArg()) {
-				if (!(ref.variable instanceof IDynamicVariable)
-						|| !((IDynamicVariable) ref.variable).supportsArgument()) {
+			final var variable= ref.variable;
+			if (variable != null && ref.hasArg()) {
+				if (!(variable instanceof IDynamicVariable)
+						|| !((IDynamicVariable)variable).supportsArgument()) {
 					this.reporter.problemFound(new Status(IStatus.ERROR, ECommonsVariablesCore.BUNDLE_ID,
 							NLS.bind(Messages.Validation_Ref_VarNoArgs_message,
 									ref.name )),
@@ -418,12 +416,13 @@
 					arg= null;
 				}
 				
-				if (ref.variable == null) {
+				final var variable= ref.variable;
+				if (variable == null) {
 					ref.value= RESOLVE_FAILED_VALUE;
 					continue;
 				}
 				
-				ref.value= resolve(ref.variable, arg);
+				ref.value= resolve(variable, arg);
 			}
 			catch (final CoreException e) {
 				ref.value= RESOLVE_FAILED_VALUE;
@@ -445,8 +444,9 @@
 		while (refIdx < this.references.size()) {
 			final VariableReference ref= this.references.get(refIdx++);
 			if (ref.begin >= begin && ref.begin < end) {
+				final String value= nonNullAssert(ref.value);
 				newText.append(text, begin, ref.begin);
-				newText.append(ref.value);
+				newText.append(value);
 				begin= ref.end;
 			}
 		}
@@ -460,8 +460,13 @@
 		while (refIdx < this.references.size()) {
 			final VariableReference ref= this.references.get(refIdx++);
 			if (ref.begin >= begin && ref.begin < end) {
+				String value= nonNullAssert(ref.value);
+				final var variable= ref.variable;
+				if (variable != null) {
+					value= checkValue(variable, value);
+				}
 				newText.append(text, begin, ref.begin);
-				newText.append(checkValue(ref.variable, ref.value));
+				newText.append(value);
 				begin= ref.end;
 			}
 		}
@@ -473,10 +478,10 @@
 			throws CoreException {
 		final String value;
 		if (variable instanceof IDynamicVariable) {
-			value= ((IDynamicVariable) variable).getValue(argument);
+			value= ((IDynamicVariable)variable).getValue(argument);
 		}
 		else {
-			value= ((IValueVariable) variable).getValue();
+			value= ((IValueVariable)variable).getValue();
 //			if (value != null && value.indexOf("${") >= 0) {
 //				value= VariablesPlugin.getDefault().getStringVariableManager().performStringSubstitution(value, true);
 //			}