This is an automated email from the ASF dual-hosted git repository.
jlahoda pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new f8b7688 [NETBEANS-1728] fix for Exception encountered when break
returns value
f8b7688 is described below
commit f8b7688939b3aef29875d9a1ff6a355fca20973b
Author: Sarvesh Kesharwani <[email protected]>
AuthorDate: Mon Jan 28 00:46:38 2019 +0530
[NETBEANS-1728] fix for Exception encountered when break returns value
---
.../semantic/MarkOccurrencesHighlighterBase.java | 62 +++++++++++++---------
.../java/editor/rename/InstantRenamePerformer.java | 3 +-
.../modules/java/hints/bugs/InfiniteRecursion.java | 2 +-
.../netbeans/modules/java/hints/bugs/NPECheck.java | 2 +-
.../java/hints/control/RemoveUnnecessary.java | 8 +--
.../modules/java/hints/introduce/Flow.java | 2 +-
.../java/hints/introduce/ScanStatement.java | 6 +--
java/java.source.base/apichanges.xml | 15 ++++++
.../org-netbeans-modules-java-source-base.sig | 1 +
.../netbeans/api/java/source/TreeUtilities.java | 54 ++++++++++++++++++-
.../java/plugins/RenameTransformer.java | 2 +-
.../java/ui/InstantRefactoringUIImpl.java | 2 +-
.../refactoring/java/ui/RenameRefactoringUI.java | 2 +-
13 files changed, 121 insertions(+), 40 deletions(-)
diff --git
a/java/java.editor.base/src/org/netbeans/modules/java/editor/base/semantic/MarkOccurrencesHighlighterBase.java
b/java/java.editor.base/src/org/netbeans/modules/java/editor/base/semantic/MarkOccurrencesHighlighterBase.java
index 9bb4164..2b7bb50 100644
---
a/java/java.editor.base/src/org/netbeans/modules/java/editor/base/semantic/MarkOccurrencesHighlighterBase.java
+++
b/java/java.editor.base/src/org/netbeans/modules/java/editor/base/semantic/MarkOccurrencesHighlighterBase.java
@@ -24,6 +24,7 @@ import com.sun.source.tree.CompilationUnitTree;
import com.sun.source.tree.ContinueTree;
import com.sun.source.tree.DoWhileLoopTree;
import com.sun.source.tree.EnhancedForLoopTree;
+import com.sun.source.tree.ExpressionTree;
import com.sun.source.tree.ForLoopTree;
import com.sun.source.tree.ImportTree;
import com.sun.source.tree.LabeledStatementTree;
@@ -47,6 +48,7 @@ import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.prefs.Preferences;
+import javax.lang.model.SourceVersion;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
@@ -499,11 +501,11 @@ public abstract class MarkOccurrencesHighlighterBase
extends JavaParserResultTas
private List<int[]> detectBreakOrContinueTarget(CompilationInfo info,
Document document, TreePath breakOrContinue, int caretPosition) {
List<int[]> result = new ArrayList<int[]>();
- StatementTree target =
info.getTreeUtilities().getBreakContinueTarget(breakOrContinue);
+ Tree target =
info.getTreeUtilities().getBreakContinueTargetTree(breakOrContinue);
if (target == null)
return null;
-
+
TokenSequence<JavaTokenId> ts =
info.getTokenHierarchy().tokenSequence(JavaTokenId.language());
ts.move((int)
info.getTrees().getSourcePositions().getStartPosition(info.getCompilationUnit(),
target));
@@ -511,30 +513,40 @@ public abstract class MarkOccurrencesHighlighterBase
extends JavaParserResultTas
if (ts.moveNext()) {
result.add(new int[] {ts.offset(), ts.offset() +
ts.token().length()});
}
-
- StatementTree statement = target.getKind() == Kind.LABELED_STATEMENT ?
((LabeledStatementTree) target).getStatement() : target;
+ StatementTree targetStatementTree = null;
+ ExpressionTree targetExpressionTree = null;
+ if (target instanceof StatementTree) {
+ targetStatementTree = target.getKind() == Kind.LABELED_STATEMENT ?
((LabeledStatementTree) target).getStatement() : (StatementTree) target;
+ } else if (target instanceof ExpressionTree) {
+ targetExpressionTree = (ExpressionTree) target;
+ }
Tree block = null;
-
- switch (statement.getKind()) {
- case SWITCH:
- block = statement;
- break;
- case WHILE_LOOP:
- if (((WhileLoopTree) statement).getStatement().getKind() ==
Kind.BLOCK)
- block = ((WhileLoopTree) statement).getStatement();
- break;
- case FOR_LOOP:
- if (((ForLoopTree) statement).getStatement().getKind() ==
Kind.BLOCK)
- block = ((ForLoopTree) statement).getStatement();
- break;
- case ENHANCED_FOR_LOOP:
- if (((EnhancedForLoopTree) statement).getStatement().getKind()
== Kind.BLOCK)
- block = ((EnhancedForLoopTree) statement).getStatement();
- break;
- case DO_WHILE_LOOP:
- if (((DoWhileLoopTree) statement).getStatement().getKind() ==
Kind.BLOCK)
- block = ((DoWhileLoopTree) statement).getStatement();
- break;
+
+ if (targetStatementTree != null) {
+ switch (targetStatementTree.getKind()) {
+ case SWITCH:
+ block = targetStatementTree;
+ break;
+ case WHILE_LOOP:
+ if (((WhileLoopTree)
targetStatementTree).getStatement().getKind() == Kind.BLOCK)
+ block = ((WhileLoopTree)
targetStatementTree).getStatement();
+ break;
+ case FOR_LOOP:
+ if (((ForLoopTree)
targetStatementTree).getStatement().getKind() == Kind.BLOCK)
+ block = ((ForLoopTree)
targetStatementTree).getStatement();
+ break;
+ case ENHANCED_FOR_LOOP:
+ if (((EnhancedForLoopTree)
targetStatementTree).getStatement().getKind() == Kind.BLOCK)
+ block = ((EnhancedForLoopTree)
targetStatementTree).getStatement();
+ break;
+ case DO_WHILE_LOOP:
+ if (((DoWhileLoopTree)
targetStatementTree).getStatement().getKind() == Kind.BLOCK)
+ block = ((DoWhileLoopTree)
targetStatementTree).getStatement();
+ break;
+ }
+ // No need to check for version of JDK, as targetExpressionTree can
only be non-null in case of JDK-12 or higher
+ } else if (targetExpressionTree != null) {
+ block = targetExpressionTree;
}
if (block != null) {
diff --git
a/java/java.editor/src/org/netbeans/modules/java/editor/rename/InstantRenamePerformer.java
b/java/java.editor/src/org/netbeans/modules/java/editor/rename/InstantRenamePerformer.java
index ad00df5..5e775e1 100644
---
a/java/java.editor/src/org/netbeans/modules/java/editor/rename/InstantRenamePerformer.java
+++
b/java/java.editor/src/org/netbeans/modules/java/editor/rename/InstantRenamePerformer.java
@@ -22,6 +22,7 @@ import com.sun.source.tree.BreakTree;
import com.sun.source.tree.ContinueTree;
import com.sun.source.tree.LabeledStatementTree;
import com.sun.source.tree.StatementTree;
+import com.sun.source.tree.Tree;
import com.sun.source.tree.Tree.Kind;
import com.sun.source.util.TreePath;
import org.netbeans.api.java.source.support.ErrorAwareTreePathScanner;
@@ -328,7 +329,7 @@ public class InstantRenamePerformer implements
DocumentListener, KeyListener {
Token<JavaTokenId> span =
org.netbeans.modules.java.editor.base.semantic.Utilities.findIdentifierSpan(info,
doc, path);
if (span != null && span.offset(null) <= adjustedCaret[0] &&
adjustedCaret[0] <= span.offset(null) + span.length()) {
if (path.getLeaf().getKind() != Kind.LABELED_STATEMENT) {
- StatementTree tgt =
info.getTreeUtilities().getBreakContinueTarget(path);
+ Tree tgt =
info.getTreeUtilities().getBreakContinueTargetTree(path);
path = tgt != null ?
info.getTrees().getPath(info.getCompilationUnit(), tgt) : null;
}
if (path != null) {
diff --git
a/java/java.hints/src/org/netbeans/modules/java/hints/bugs/InfiniteRecursion.java
b/java/java.hints/src/org/netbeans/modules/java/hints/bugs/InfiniteRecursion.java
index aac9f03..77d2641 100644
---
a/java/java.hints/src/org/netbeans/modules/java/hints/bugs/InfiniteRecursion.java
+++
b/java/java.hints/src/org/netbeans/modules/java/hints/bugs/InfiniteRecursion.java
@@ -422,7 +422,7 @@ public class InfiniteRecursion {
@Override
public State visitBreak(BreakTree node, Void p) {
- StatementTree target =
ci.getTreeUtilities().getBreakContinueTarget(getCurrentPath());
+ Tree target =
ci.getTreeUtilities().getBreakContinueTargetTree(getCurrentPath());
breakContinueJumps.add(target);
return State.NO;
}
diff --git
a/java/java.hints/src/org/netbeans/modules/java/hints/bugs/NPECheck.java
b/java/java.hints/src/org/netbeans/modules/java/hints/bugs/NPECheck.java
index 51d59fc..1731632 100644
--- a/java/java.hints/src/org/netbeans/modules/java/hints/bugs/NPECheck.java
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/bugs/NPECheck.java
@@ -1250,7 +1250,7 @@ public class NPECheck {
public State visitBreak(BreakTree node, Void p) {
super.visitBreak(node, p);
- StatementTree target =
info.getTreeUtilities().getBreakContinueTarget(getCurrentPath());
+ Tree target =
info.getTreeUtilities().getBreakContinueTargetTree(getCurrentPath());
resumeAfter(target, variable2State);
diff --git
a/java/java.hints/src/org/netbeans/modules/java/hints/control/RemoveUnnecessary.java
b/java/java.hints/src/org/netbeans/modules/java/hints/control/RemoveUnnecessary.java
index ce4df37..b1c9a7d 100644
---
a/java/java.hints/src/org/netbeans/modules/java/hints/control/RemoveUnnecessary.java
+++
b/java/java.hints/src/org/netbeans/modules/java/hints/control/RemoveUnnecessary.java
@@ -102,10 +102,10 @@ public class RemoveUnnecessary {
@Hint(displayName="#DN_RemoveUnnecessaryContinue",
description="#DESC_RemoveUnnecessaryContinue", category="general",
suppressWarnings="UnnecessaryContinue")
@TriggerPattern("continue $val$;")
public static ErrorDescription unnecessaryContinue(HintContext ctx) {
- return unnecessaryReturnContinue(ctx,
ctx.getInfo().getTreeUtilities().getBreakContinueTarget(ctx.getPath()),
"UnnecessaryContinueStatement", false);
+ return unnecessaryReturnContinue(ctx,
ctx.getInfo().getTreeUtilities().getBreakContinueTargetTree(ctx.getPath()),
"UnnecessaryContinueStatement", false);
}
- private static ErrorDescription unnecessaryReturnContinue(HintContext ctx,
StatementTree targetLoop, String key, boolean isReturn) {
+ private static ErrorDescription unnecessaryReturnContinue(HintContext ctx,
Tree targetLoop, String key, boolean isReturn) {
TreePath tp = ctx.getPath();
OUTER: while (tp != null &&
!TreeUtilities.CLASS_TREE_KINDS.contains(tp.getLeaf().getKind())) {
@@ -193,7 +193,7 @@ public class RemoveUnnecessary {
}
if (next.getKind() == Kind.BREAK) {
- StatementTree target =
ctx.getInfo().getTreeUtilities().getBreakContinueTarget(new TreePath(tp, next));
+ Tree target =
ctx.getInfo().getTreeUtilities().getBreakContinueTargetTree(new TreePath(tp,
next));
if (target == null) return null;
@@ -467,7 +467,7 @@ public class RemoveUnnecessary {
if (loop == null) return null;
- if
(ctx.getInfo().getTreeUtilities().getBreakContinueTarget(ctx.getPath()) !=
loop.getParentPath().getLeaf()) return null;
+ if
(ctx.getInfo().getTreeUtilities().getBreakContinueTargetTree(ctx.getPath()) !=
loop.getParentPath().getLeaf()) return null;
Fix fix = JavaFixUtilities.rewriteFix(ctx, brk ?
Bundle.FIX_UnnecessaryBreakStatementLabel() :
Bundle.FIX_UnnecessaryContinueStatementLabel(), ctx.getPath(), brk ? "break;" :
"continue;");
diff --git
a/java/java.hints/src/org/netbeans/modules/java/hints/introduce/Flow.java
b/java/java.hints/src/org/netbeans/modules/java/hints/introduce/Flow.java
index f1ddde1..dde0c59 100644
--- a/java/java.hints/src/org/netbeans/modules/java/hints/introduce/Flow.java
+++ b/java/java.hints/src/org/netbeans/modules/java/hints/introduce/Flow.java
@@ -1170,7 +1170,7 @@ public class Flow {
public Boolean visitBreak(BreakTree node, ConstructorData p) {
super.visitBreak(node, p);
- StatementTree target =
info.getTreeUtilities().getBreakContinueTarget(getCurrentPath());
+ Tree target =
info.getTreeUtilities().getBreakContinueTargetTree(getCurrentPath());
resumeAfter(target, variable2State);
diff --git
a/java/java.hints/src/org/netbeans/modules/java/hints/introduce/ScanStatement.java
b/java/java.hints/src/org/netbeans/modules/java/hints/introduce/ScanStatement.java
index bb5c758..dcca325 100644
---
a/java/java.hints/src/org/netbeans/modules/java/hints/introduce/ScanStatement.java
+++
b/java/java.hints/src/org/netbeans/modules/java/hints/introduce/ScanStatement.java
@@ -238,7 +238,7 @@ final class ScanStatement extends
ErrorAwareTreePathScanner<Void, Void> {
@Override
public Void visitBreak(BreakTree node, Void p) {
- if (isMethodCode() && phase == PHASE_INSIDE_SELECTION &&
!treesSeensInSelection.contains(info.getTreeUtilities().getBreakContinueTarget(getCurrentPath())))
{
+ if (isMethodCode() && phase == PHASE_INSIDE_SELECTION &&
!treesSeensInSelection.contains(info.getTreeUtilities().getBreakContinueTargetTree(getCurrentPath())))
{
selectionExits.add(getCurrentPath());
hasBreaks = true;
}
@@ -319,7 +319,7 @@ final class ScanStatement extends
ErrorAwareTreePathScanner<Void, Void> {
if ((exitsFromAllBranches ? 0 : i) + usedAfterSelection.size() > 1) {
return "ERR_Too_Many_Return_Values"; // NOI18N
}
- StatementTree breakOrContinueTarget = null;
+ Tree breakOrContinueTarget = null;
boolean returnValueComputed = false;
TreePath returnValue = null;
for (TreePath tp : selectionExits) {
@@ -344,7 +344,7 @@ final class ScanStatement extends
ErrorAwareTreePathScanner<Void, Void> {
}
}
} else {
- StatementTree target =
info.getTreeUtilities().getBreakContinueTarget(tp);
+ Tree target =
info.getTreeUtilities().getBreakContinueTargetTree(tp);
if (breakOrContinueTarget == null) {
breakOrContinueTarget = target;
}
diff --git a/java/java.source.base/apichanges.xml
b/java/java.source.base/apichanges.xml
index 940b76f..6d4c376 100644
--- a/java/java.source.base/apichanges.xml
+++ b/java/java.source.base/apichanges.xml
@@ -297,6 +297,21 @@
</p>
</description>
</change>
+ <change id="TreeUtilities.getBreakContinueTargetTree">
+ <api name="javasource_base" />
+ <summary>Find the target of Break or Continue statement</summary>
+ <version major="1" minor="2.40.0"/>
+ <date day="22" month="1" year="2019"/>
+ <author login="sarveshkesharwani"/>
+ <compatibility addition="yes" binary="compatible" source="compatible"/>
+ <description>
+ <p>
+ Find the target of <code>break</code> or <code>continue</code>
+ statement. Target is of type Tree here.
+ </p>
+ </description>
+ <class name="TreeUtilities" package="org.netbeans.api.java.source"/>
+ </change>
</changes>
<htmlcontents>
<head>
diff --git
a/java/java.source.base/nbproject/org-netbeans-modules-java-source-base.sig
b/java/java.source.base/nbproject/org-netbeans-modules-java-source-base.sig
index 6c8a3f7..6ea486c 100644
--- a/java/java.source.base/nbproject/org-netbeans-modules-java-source-base.sig
+++ b/java/java.source.base/nbproject/org-netbeans-modules-java-source-base.sig
@@ -1577,6 +1577,7 @@ meth public com.sun.source.tree.Scope
reattributeTreeTo(com.sun.source.tree.Tree
meth public com.sun.source.tree.Scope scopeFor(int)
meth public com.sun.source.tree.Scope
toScopeWithDisabledAccessibilityChecks(com.sun.source.tree.Scope)
meth public com.sun.source.tree.StatementTree
getBreakContinueTarget(com.sun.source.util.TreePath)
+meth public com.sun.source.tree.Tree
getBreakContinueTargetTree(com.sun.source.util.TreePath)
meth public com.sun.source.tree.StatementTree
parseStatement(java.lang.String,com.sun.source.util.SourcePositions[])
meth public com.sun.source.tree.Tree
translate(com.sun.source.tree.Tree,java.util.Map<? extends
com.sun.source.tree.Tree,? extends com.sun.source.tree.Tree>)
anno 0 org.netbeans.api.annotations.common.NonNull()
diff --git
a/java/java.source.base/src/org/netbeans/api/java/source/TreeUtilities.java
b/java/java.source.base/src/org/netbeans/api/java/source/TreeUtilities.java
index 4532d42..9728eef 100644
--- a/java/java.source.base/src/org/netbeans/api/java/source/TreeUtilities.java
+++ b/java/java.source.base/src/org/netbeans/api/java/source/TreeUtilities.java
@@ -1342,6 +1342,54 @@ public final class TreeUtilities {
* The
<code>breakOrContinue.getLeaf().getKind()</code>
* has to be either {@link Kind#BREAK} or {@link
Kind#CONTINUE}, or
* an IllegalArgumentException is thrown
+ * @return the tree that is the "target" for the given break or continue
statement, or null if there is none. Tree can be of type StatementTree or
ExpressionTree
+ * @throws IllegalArgumentException if the given tree is not a break or
continue tree or if the given {@link CompilationInfo}
+ * is not in the {@link Phase#RESOLVED} phase.
+ * @since 2.40
+ */
+ public Tree getBreakContinueTargetTree(TreePath breakOrContinue) throws
IllegalArgumentException {
+ if (info.getPhase().compareTo(Phase.RESOLVED) < 0)
+ throw new IllegalArgumentException("Not in correct Phase.
Required: Phase.RESOLVED, got: Phase." + info.getPhase().toString());
+
+ Tree leaf = breakOrContinue.getLeaf();
+
+ switch (leaf.getKind()) {
+ case BREAK:
+ return (Tree) ((JCTree.JCBreak) leaf).target;
+ case CONTINUE:
+ Tree target = (Tree) ((JCTree.JCContinue) leaf).target;
+
+ if (target == null)
+ return null;
+
+ if (((JCTree.JCContinue) leaf).label == null)
+ return target;
+
+ TreePath tp = breakOrContinue;
+
+ while (tp.getLeaf() != target) {
+ tp = tp.getParentPath();
+ }
+
+ Tree parent = tp.getParentPath().getLeaf();
+
+ if (parent.getKind() == Kind.LABELED_STATEMENT) {
+ return (StatementTree) parent;
+ } else {
+ return target;
+ }
+ default:
+ throw new IllegalArgumentException("Unsupported kind: " +
leaf.getKind());
+ }
+ }
+
+ /**Find the target of <code>break</code> or <code>continue</code>. The
given
+ * {@link CompilationInfo} has to be at least in the {@link
Phase#RESOLVED} phase.
+ *
+ * @param breakOrContinue {@link TreePath} to the tree that should be
inspected.
+ * The
<code>breakOrContinue.getLeaf().getKind()</code>
+ * has to be either {@link Kind#BREAK} or {@link
Kind#CONTINUE}, or
+ * an IllegalArgumentException is thrown
* @return the tree that is the "target" for the given break or continue
statement, or null if there is none.
* @throws IllegalArgumentException if the given tree is not a break or
continue tree or if the given {@link CompilationInfo}
* is not in the {@link Phase#RESOLVED} phase.
@@ -1355,7 +1403,11 @@ public final class TreeUtilities {
switch (leaf.getKind()) {
case BREAK:
- return (StatementTree) ((JCTree.JCBreak) leaf).target;
+ Tree breakTarget = (Tree) ((JCTree.JCBreak) leaf).target;
+ if (breakTarget == null || !(breakTarget instanceof
StatementTree)) {
+ return null;
+ }
+ return (StatementTree) breakTarget;
case CONTINUE:
StatementTree target = (StatementTree) ((JCTree.JCContinue)
leaf).target;
diff --git
a/java/refactoring.java/src/org/netbeans/modules/refactoring/java/plugins/RenameTransformer.java
b/java/refactoring.java/src/org/netbeans/modules/refactoring/java/plugins/RenameTransformer.java
index d502eec..5ce03c7 100644
---
a/java/refactoring.java/src/org/netbeans/modules/refactoring/java/plugins/RenameTransformer.java
+++
b/java/refactoring.java/src/org/netbeans/modules/refactoring/java/plugins/RenameTransformer.java
@@ -170,7 +170,7 @@ public class RenameTransformer extends RefactoringVisitor {
@Override
public Tree visitBreak(BreakTree tree, Element p) {
if(handle != null && handle.getKind() == Tree.Kind.LABELED_STATEMENT) {
- StatementTree target =
workingCopy.getTreeUtilities().getBreakContinueTarget(getCurrentPath());
+ Tree target =
workingCopy.getTreeUtilities().getBreakContinueTargetTree(getCurrentPath());
if(target == handle.resolve(workingCopy).getLeaf()) {
BreakTree newTree = make.Break(newName);
rewrite(tree, newTree);
diff --git
a/java/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/InstantRefactoringUIImpl.java
b/java/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/InstantRefactoringUIImpl.java
index bd90569..9728cd5 100644
---
a/java/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/InstantRefactoringUIImpl.java
+++
b/java/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/InstantRefactoringUIImpl.java
@@ -414,7 +414,7 @@ public final class InstantRefactoringUIImpl implements
InstantRefactoringUI {
}
if (nameSpan != null && nameSpan[0] <= adjustedCaret[0] &&
adjustedCaret[0] <= nameSpan[1]) {
if (path[0].getLeaf().getKind() != Tree.Kind.LABELED_STATEMENT) {
- StatementTree tgt =
info.getTreeUtilities().getBreakContinueTarget(path[0]);
+ Tree tgt =
info.getTreeUtilities().getBreakContinueTargetTree(path[0]);
path[0] = tgt != null ?
info.getTrees().getPath(info.getCompilationUnit(), tgt) : null;
}
if (path[0] != null) {
diff --git
a/java/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/RenameRefactoringUI.java
b/java/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/RenameRefactoringUI.java
index fd8e7da..aa35f3b 100644
---
a/java/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/RenameRefactoringUI.java
+++
b/java/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/RenameRefactoringUI.java
@@ -409,7 +409,7 @@ public class RenameRefactoringUI implements RefactoringUI,
RefactoringUIBypass,
if(resolve != null && EnumSet.of(Kind.LABELED_STATEMENT,
Kind.BREAK, Kind.CONTINUE).contains(resolve.getLeaf().getKind())) {
TreePath path = resolve;
if (path.getLeaf().getKind() != Kind.LABELED_STATEMENT) {
- StatementTree tgt =
info.getTreeUtilities().getBreakContinueTarget(path);
+ Tree tgt =
info.getTreeUtilities().getBreakContinueTargetTree(path);
path = tgt != null ?
info.getTrees().getPath(info.getCompilationUnit(), tgt) : null;
}
if (path == null) {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists