X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Parser.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Parser.java index 95c4fd6..05333a1 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Parser.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Parser.java @@ -11,6 +11,11 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import net.sourceforge.phpdt.core.ICompilationUnit; +import net.sourceforge.phpdt.core.IJavaElement; +import net.sourceforge.phpdt.core.IType; +import net.sourceforge.phpdt.core.JavaCore; +import net.sourceforge.phpdt.core.JavaModelException; import net.sourceforge.phpdt.core.compiler.CharOperation; import net.sourceforge.phpdt.core.compiler.ITerminalSymbols; import net.sourceforge.phpdt.core.compiler.InvalidInputException; @@ -428,8 +433,13 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI if (branchStatement && statement != null) { // reportSyntaxError("Unreachable code", statement.sourceStart, // statement.sourceEnd); - problemReporter.unreachableCode(new String(scanner.getCurrentIdentifierSource()), statement.sourceStart, + if (! (statement instanceof BreakStatement)) { + /* don't give an error for break statement following return statement + Technically it's unreachable code, but in switch-case it's recommended to + avoid accidental fall-through later when editing the code */ + problemReporter.unreachableCode(new String(scanner.getCurrentIdentifierSource()), statement.sourceStart, statement.sourceEnd, referenceContext, compilationUnit.compilationResult); + } } if ((token == TokenNameRBRACE) || (token == TokenNamecase) || (token == TokenNamedefault) || (token == TokenNameelse) || (token == TokenNameelseif) || (token == TokenNameendif) || (token == TokenNameendfor) @@ -1270,7 +1280,7 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI // | T_EXTENDS interface_list if (token == TokenNameextends) { getNextToken(); - interface_list(); + class_list(typeDecl); } } @@ -1279,11 +1289,37 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI // | T_IMPLEMENTS interface_list if (token == TokenNameimplements) { getNextToken(); - interface_list(); + interface_list(typeDecl); } } - private void interface_list() { + private void class_list(TypeDeclaration typeDecl) { + // class_list: + // fully_qualified_class_name + do { + if (token == TokenNameIdentifier) { + char[] ident = scanner.getCurrentIdentifierSource(); + // TODO make this code working better: + // SingleTypeReference ref = ParserUtil.getTypeReference(scanner, + // includesList, ident); + // if (ref != null) { + // typeDecl.superclass = ref; + // } + getNextToken(); + } else { + throwSyntaxError("Classname expected after keyword 'extends'."); + } + if (token == TokenNameCOMMA) { + reportSyntaxError("No multiple inheritence allowed. Expected token 'implements' or '{'."); + getNextToken(); + continue; + } else { + break; + } + } while (true); + } + + private void interface_list(TypeDeclaration typeDecl) { // interface_list: // fully_qualified_class_name // | interface_list ',' fully_qualified_class_name @@ -1291,7 +1327,7 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI if (token == TokenNameIdentifier) { getNextToken(); } else { - throwSyntaxError("Interface name expected after keyword 'implements'."); + throwSyntaxError("Interfacename expected after keyword 'implements'."); } if (token != TokenNameCOMMA) { return; @@ -2172,11 +2208,11 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI if (Scanner.TRACE) { System.out.println("TRACE: expr()"); } - return expr_without_variable(true); + return expr_without_variable(true,null); // } } - private Expression expr_without_variable(boolean only_variable) { + private Expression expr_without_variable(boolean only_variable, UninitializedVariableHandler initHandler) { int exprSourceStart = scanner.getCurrentTokenStartPosition(); int exprSourceEnd = scanner.getCurrentTokenEndPosition(); Expression expression = new Expression(); @@ -2526,8 +2562,10 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI && token != TokenNameLEFT_SHIFT_EQUAL) { FieldReference ref = (FieldReference) lhs; if (!containsVariableSet(ref.token)) { - problemReporter.uninitializedLocalVariable(new String(ref.token), ref.sourceStart(), ref.sourceEnd(), + if (null==initHandler || initHandler.reportError()) { + problemReporter.uninitializedLocalVariable(new String(ref.token), ref.sourceStart, ref.sourceEnd, referenceContext, compilationUnit.compilationResult); + } addVariableSet(ref.token); } } @@ -2551,7 +2589,7 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI // example: // $var = & new Object(); if (fMethodVariables != null) { - VariableInfo lhsInfo = new VariableInfo(((FieldReference) lhs).sourceStart()); + VariableInfo lhsInfo = new VariableInfo(((FieldReference) lhs).sourceStart); lhsInfo.reference = classRef; lhsInfo.typeIdentifier = classRef.token; fMethodVariables.put(new String(((FieldReference) lhs).token), lhsInfo); @@ -2567,7 +2605,7 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI if (fMethodVariables != null) { VariableInfo rhsInfo = (VariableInfo) fMethodVariables.get(((FieldReference) rhs).token); if (rhsInfo != null && rhsInfo.reference != null) { - VariableInfo lhsInfo = new VariableInfo(((FieldReference) lhs).sourceStart()); + VariableInfo lhsInfo = new VariableInfo(((FieldReference) lhs).sourceStart); lhsInfo.reference = rhsInfo.reference; lhsInfo.typeIdentifier = rhsInfo.typeIdentifier; fMethodVariables.put(new String(((FieldReference) lhs).token), lhsInfo); @@ -2585,7 +2623,7 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI if (fMethodVariables != null) { VariableInfo rhsInfo = (VariableInfo) fMethodVariables.get(((FieldReference) rhs).token); if (rhsInfo != null && rhsInfo.reference != null) { - VariableInfo lhsInfo = new VariableInfo(((FieldReference) lhs).sourceStart()); + VariableInfo lhsInfo = new VariableInfo(((FieldReference) lhs).sourceStart); lhsInfo.reference = rhsInfo.reference; lhsInfo.typeIdentifier = rhsInfo.typeIdentifier; fMethodVariables.put(new String(((FieldReference) lhs).token), lhsInfo); @@ -2596,7 +2634,7 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI // example: // $var = new Object(); if (fMethodVariables != null) { - VariableInfo lhsInfo = new VariableInfo(((FieldReference) lhs).sourceStart()); + VariableInfo lhsInfo = new VariableInfo(((FieldReference) lhs).sourceStart); lhsInfo.reference = (SingleTypeReference) rhs; lhsInfo.typeIdentifier = ((SingleTypeReference) rhs).token; fMethodVariables.put(new String(((FieldReference) lhs).token), lhsInfo); @@ -2607,7 +2645,7 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI } if (rememberedVar == false && lhs != null && lhs instanceof FieldReference) { if (fMethodVariables != null) { - VariableInfo lhsInfo = new VariableInfo(((FieldReference) lhs).sourceStart()); + VariableInfo lhsInfo = new VariableInfo(((FieldReference) lhs).sourceStart); fMethodVariables.put(new String(((FieldReference) lhs).token), lhsInfo); } } @@ -3034,12 +3072,16 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI return ref; } + private void non_empty_function_call_parameter_list() { + this.non_empty_function_call_parameter_list(null); + } + // private void function_call_parameter_list() { // function_call_parameter_list: // non_empty_function_call_parameter_list { $$ = $1; } // | /* empty */ // } - private void non_empty_function_call_parameter_list() { + private void non_empty_function_call_parameter_list(String functionName) { // non_empty_function_call_parameter_list: // expr_without_variable // | variable @@ -3050,7 +3092,10 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI if (Scanner.TRACE) { System.out.println("TRACE: non_empty_function_call_parameter_list()"); } + UninitializedVariableHandler initHandler = new UninitializedVariableHandler(); + initHandler.setFunctionName(functionName); while (true) { + initHandler.incrementArgumentCount(); if (token == TokenNameAND) { getNextToken(); w_variable(true); @@ -3060,7 +3105,7 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI // || token == TokenNameDOLLAR) { // variable(); // } else { - expr_without_variable(true); + expr_without_variable(true, initHandler); // } } if (token != TokenNameCOMMA) { @@ -3429,14 +3474,14 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI getNextToken(); ref = null; } else { - non_empty_function_call_parameter_list(); + String functionName; + if (ident == null) { + functionName = new String(" "); + } else { + functionName = new String(ident); + } + non_empty_function_call_parameter_list(functionName); if (token != TokenNameRPAREN) { - String functionName; - if (ident == null) { - functionName = new String(" "); - } else { - functionName = new String(ident); - } throwSyntaxError("')' expected in function call (" + functionName + ")."); } getNextToken(); @@ -3874,8 +3919,10 @@ public class Parser implements ITerminalSymbols, CompilerModifiers, ParserBasicI String ext = file.getRawLocation().getFileExtension(); int fileExtensionLength = ext == null ? 0 : ext.length() + 1; + IFile f = PHPFileUtil.createFile(path, project); + impt.tokens = CharOperation.splitOn('/', filePath.toCharArray(), 0, filePath.length() - fileExtensionLength); - impt.setFile(PHPFileUtil.createFile(path, project)); + impt.setFile(f); } catch (Exception e) { // the file is outside of the workspace }