122122import org .eclipse .jdt .core .dom .WhileStatement ;
123123import org .eclipse .jdt .core .dom .WildcardType ;
124124
125+ // BH 6/23/2018 -- synchronized(a = new Object()) {...} ---> if(!(a = new Object()) {throw new NullPointerException()}else{...}
126+ // BH 6/21/2018 -- CharSequence.subSequence() should be defined both subSequence$I$I and subSequence
125127// BH 6/20/2018 -- fixes for (int var : new int[] {3,4,5}) becoming for var var
126128// BH 6/19/2018 -- adds .j2s j2s.class.replacements=org.apache.log4j.->jalview.javascript.log4j.;
127129// BH 5/15/2018 -- fix for a[pt++] |= 3 incrementing pt twice and disregarding a[][] (see test/Test_Or.java)
@@ -339,8 +341,8 @@ public void endVisit(Block node) {
339341 // look for trailing j2sNative block just before the end of a block
340342 getJ2sJavadoc (node , false );
341343 buffer .append ("}" );
342- clearVariables (getVariableList ( 'f' ) );
343- clearVariables (getVariableList ( 'n' ) );
344+ clearVariables ('f' );
345+ clearVariables ('n' );
344346 blockLevel --;
345347 super .endVisit (node );
346348 }
@@ -495,8 +497,11 @@ public boolean visit(EmptyStatement node) {
495497 }
496498
497499 public boolean visit (EnhancedForStatement node ) {
498- String varName = getQualifiedSimpleName (node .getParameter ().getName ());
499- writeReplaceV ("for (var V, $V = " , "V" , varName );
500+ SimpleName name = node .getParameter ().getName ();
501+ String varName = getQualifiedSimpleName (name );
502+ buffer .append ("for (var " );
503+ acceptVariableFinal (name , 1 );
504+ writeReplaceV (", $V = " , "V" , varName );
500505 Expression exp = node .getExpression ();
501506 ITypeBinding typeBinding = exp .resolveTypeBinding ();
502507 if (typeBinding .isArray ()) {
@@ -672,8 +677,6 @@ public boolean visit(MethodDeclaration node) {
672677 buffer .append ("alert('native method must be replaced! " + key + "');\r \n " );
673678 log ("native: " + key );
674679 }
675- // didn't we just find out that there was nothing to do?
676- // addNativeJavadoc(node.getJavadoc(), null);
677680 buffer .append ("}\r \n " );
678681 // clearVariables(getVariableList('n'));
679682 // blockLevel--;
@@ -689,16 +692,33 @@ public boolean visit(MethodDeclaration node) {
689692 public void endVisit (MethodDeclaration node ) {
690693 if (NativeDoc .checkj2sIgnore (node ))
691694 return ;
695+ removeVariableFinals (node );
696+ super .endVisit (node );
697+ }
698+
699+ private void acceptVariableFinal (SimpleName name , int offset ) {
700+ IBinding binding = name .resolveBinding ();
701+ if (binding != null ) {
702+ String identifier = name .getIdentifier ();
703+ int level = blockLevel + offset ;
704+ VariableAdapter .FinalVariable f = new VariableAdapter .FinalVariable (level , identifier ,
705+ methodDeclareNameStack .size () == 0 ? null : methodDeclareNameStack .peek ());
706+ addVariable (f , identifier , binding );
707+ //buffer.append("/*blockLevel " + blockLevel + " level " + level + "*/");
708+ }
709+ name .accept (this );
710+ }
711+
712+ private void removeVariableFinals (MethodDeclaration node ) {
692713 IMethodBinding mBinding = node .resolveBinding ();
693714 if (mBinding != null )
694715 methodDeclareNameStack .pop ();
716+ @ SuppressWarnings ("unchecked" )
717+ List <SingleVariableDeclaration > parameters = node .parameters ();
718+ String methodSig = (mBinding == null ? null : mBinding .getKey ());
695719 List <VariableAdapter .FinalVariable > finalVars = getVariableList ('f' );
696720 List <VariableAdapter .FinalVariable > visitedVars = getVariableList ('v' );
697721 List <VariableAdapter .FinalVariable > normalVars = getVariableList ('n' );
698- @ SuppressWarnings ("unchecked" )
699- List <SingleVariableDeclaration > parameters = node .parameters ();
700- IMethodBinding resolveBinding = node .resolveBinding ();
701- String methodSig = (resolveBinding == null ? null : resolveBinding .getKey ());
702722 for (int i = parameters .size () - 1 ; i >= 0 ; i --) {
703723 SingleVariableDeclaration varDecl = parameters .get (i );
704724 SimpleName name = varDecl .getName ();
@@ -708,13 +728,26 @@ public void endVisit(MethodDeclaration node) {
708728 VariableAdapter .FinalVariable f = new VariableAdapter .FinalVariable (blockLevel + 1 , identifier , methodSig );
709729 f .toVariableName = identifier ;
710730 normalVars .remove (f );
731+ //buffer.append("/*remNorm " + f.variableName + "/to/" + f.toVariableName + "*/");
711732 if (Modifier .isFinal (binding .getModifiers ())) {
712733 finalVars .remove (f );
734+ //buffer.append("/*remFinal " + f.variableName + "/to/" + f.toVariableName + "*/");
713735 }
714736 visitedVars .remove (f );
737+ //buffer.append("/*remVis " + f.variableName + "/to/" + f.toVariableName + "*/");
738+ }
739+ }
740+ }
741+
742+ private void clearVariables (char nf ) {
743+ List <VariableAdapter .FinalVariable > vars = getVariableList (nf );
744+ for (int i = vars .size (); --i >= 0 ;) {
745+ VariableAdapter .FinalVariable var = vars .get (i );
746+ if (var .blockLevel >= blockLevel ) {
747+ vars .remove (i );
748+ //buffer.append("/*remVar " + nf + " " + var.toVariableName + " */");
715749 }
716750 }
717- super .endVisit (node );
718751 }
719752
720753 public boolean visit (MethodInvocation node ) {
@@ -817,21 +850,12 @@ public void endVisit(ReturnStatement node) {
817850 super .endVisit (node );
818851 }
819852
853+ /**
854+ * method parameters or catch variables
855+ */
820856 public boolean visit (SingleVariableDeclaration node ) {
821857 SimpleName name = node .getName ();
822- IBinding binding = name .resolveBinding ();
823- if (binding != null ) {
824- String identifier = name .getIdentifier ();
825- VariableAdapter .FinalVariable f = null ;
826- if (methodDeclareNameStack .size () == 0 ) {
827- f = new VariableAdapter .FinalVariable (blockLevel + 1 , identifier , null );
828- } else {
829- String methodSig = methodDeclareNameStack .peek ();
830- f = new VariableAdapter .FinalVariable (blockLevel + 1 , identifier , methodSig );
831- }
832- addVariable (f , identifier , binding );
833- }
834- name .accept (this );
858+ acceptVariableFinal (name , 1 );
835859 return false ;
836860 }
837861
@@ -886,7 +910,11 @@ public boolean visit(SwitchCase node) {
886910 }
887911
888912 public boolean visit (SynchronizedStatement node ) {
889- // not implemented in JS, as there is only one thread
913+ // we wrap this with a simple if() statement,
914+ // checking that it is not null
915+ buffer .append ("if(!(" );
916+ node .getExpression ().accept (this );
917+ buffer .append ("){throw new NullPointerException()}else" );
890918 node .getBody ().accept (this );
891919 return false ;
892920 }
@@ -1743,15 +1771,6 @@ private void addSuperConstructor(SuperConstructorInvocation node, IMethodBinding
17431771 addCallInit ();
17441772 }
17451773
1746- private void clearVariables (List <VariableAdapter .FinalVariable > vars ) {
1747- for (int i = vars .size (); --i >= 0 ;) {
1748- VariableAdapter .FinalVariable var = vars .get (i );
1749- if (var .blockLevel >= blockLevel ) {
1750- vars .remove (i );
1751- }
1752- }
1753- }
1754-
17551774 private String getAnonymousName (ITypeBinding binding ) {
17561775 String binaryName = null , bindingKey ;
17571776 if ((binding .isAnonymous () || binding .isLocal ()) && (binaryName = binding .getBinaryName ()) == null
@@ -2826,12 +2845,13 @@ private String simpleNameInVarBinding(SimpleName node, char ch, IVariableBinding
28262845 if (currentBlockForVisit != -1 ) {
28272846 List <VariableAdapter .FinalVariable > finalVars = getVariableList ('f' );
28282847 List <VariableAdapter .FinalVariable > visitedVars = getVariableList ('v' );
2829- int size = finalVars . size ();
2830- for (int i = 0 ; i < size ; i ++) {
2848+ String vname = varBinding . getName ();
2849+ for (int i = 0 , size = finalVars . size () ; i < size ; i ++) {
28312850 VariableAdapter .FinalVariable vv = finalVars .get (size - i - 1 );
2832- if (vv .variableName . equals ( varBinding . getName ()) && vv . blockLevel <= currentBlockForVisit ) {
2851+ if (vv .blockLevel <= currentBlockForVisit && vv . variableName . equals ( vname ) ) {
28332852 if (!visitedVars .contains (vv )) {
28342853 visitedVars .add (vv );
2854+ //buffer.append("/* current " + currentBlockForVisit + " vlevel " + vv.blockLevel + " " + vv.variableName + "*/");
28352855 }
28362856 fieldVar = vv .toVariableName ;
28372857 }
@@ -2954,11 +2974,7 @@ public boolean visit(VariableDeclarationFragment node) {
29542974 IBinding binding = name .resolveBinding ();
29552975 if (binding == null )
29562976 return false ;
2957- String identifier = name .getIdentifier ();
2958- VariableAdapter .FinalVariable f = new VariableAdapter .FinalVariable (blockLevel , identifier ,
2959- methodDeclareNameStack .size () == 0 ? null : (String ) methodDeclareNameStack .peek ());
2960- addVariable (f , identifier , binding );
2961- name .accept (this );
2977+ acceptVariableFinal (name , 0 );
29622978 Expression right = node .getInitializer ();
29632979 ITypeBinding rightBinding = (right == null ? null : right .resolveTypeBinding ());
29642980 if (rightBinding == null )
@@ -3608,8 +3624,11 @@ private void addVariable(VariableAdapter.FinalVariable f, String identifier, IBi
36083624 List <VariableAdapter .FinalVariable > normalVars = getVariableList ('n' );
36093625 f .toVariableName = identifier ;
36103626 normalVars .add (f );
3611- if (Modifier .isFinal (binding .getModifiers ()))
3627+ //buffer.append("/*addVar n " + identifier + " */");
3628+ if (Modifier .isFinal (binding .getModifiers ())) {
36123629 finalVars .add (f );
3630+ //buffer.append("/*addVar f " + identifier + " */");
3631+ }
36133632 }
36143633
36153634 /**
@@ -4109,6 +4128,10 @@ private String getMethodNameOrArrayForDeclaration(MethodDeclaration node, IMetho
41094128 boolean isConstructor , boolean addUnqualified ) {
41104129 SimpleName nodeName = node .getName ();
41114130 String methodName = (isConstructor ? "c$" : NameMapper .getJ2SName (nodeName ));
4131+ if (methodName .equals ("subSequence$I$I" )) {
4132+ // for StringBuffer and StringBuilder to be like String
4133+ return "['subSequence','subSequence$I$I']" ;
4134+ }
41124135 String qname = getJ2SQualifiedName (methodName , null , mBinding , null , false );
41134136 ITypeBinding methodClass = mBinding .getDeclaringClass ();
41144137 List <String > names = null ;
0 commit comments