Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2,689 changes: 1,373 additions & 1,316 deletions php/php.editor/src/org/netbeans/modules/php/editor/lexer/PHP5ColoringLexer.java

Large diffs are not rendered by default.

2,740 changes: 1,392 additions & 1,348 deletions php/php.editor/src/org/netbeans/modules/php/editor/parser/ASTPHP5Scanner.java

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,17 @@

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
* Represents complex qoute(i.e. qoute that includes string and variables).
* Also represents heredoc
* <pre>e.g.<pre>
* <pre>e.g.
* "this is $a quote",
* "'single ${$complex->quote()}'"
* >>>Heredoc\n This is here documents \nHeredoc;\n
*
* </pre>
* Note: "This is".$not." a quote node",
* 'This is $not a quote too'
*/
Expand Down Expand Up @@ -58,7 +59,7 @@ public Quote(int start, int end, List<Exception> expressions, Quote.Type type) {
* @return expression list of the echo statement
*/
public List<Expression> getExpressions() {
return this.expressions;
return Collections.unmodifiableList(this.expressions);
}

/**
Expand All @@ -80,7 +81,7 @@ public String toString() {
for (Expression expression : getExpressions()) {
sb.append(expression).append(","); //NOI18N
}
return getQuoteType() + " " + sb.toString();
return getQuoteType() + " " + sb.toString(); //NOI18N
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ public CheckVisitor(FileObject fileObject) {

public Collection<VerificationError> getErrors() {
checkFunctionCallTrailingCommas();
checkFlexibleHeredocAndNowdoc();
return Collections.unmodifiableCollection(errors);
}

Expand Down Expand Up @@ -209,6 +210,56 @@ private void checkListReferenceAssignment(List<ArrayElement> elements) {
});
}

private void checkFlexibleHeredocAndNowdoc() {
if (CancelSupport.getDefault().isCancelled()) {
return;
}

BaseDocument document = GsfUtilities.getDocument(fileObject, true);
if (document == null) {
return;
}
document.readLock();
try {
TokenSequence<PHPTokenId> ts = LexUtilities.getPHPTokenSequence(document, document.getLength());
if (ts == null) {
return;
}
ts.move(document.getLength());
checkHeredocNowdocIndentationAndNewline(ts);
} finally {
document.readUnlock();
}
}

private void checkHeredocNowdocIndentationAndNewline(TokenSequence<PHPTokenId> ts) {
Token<? extends PHPTokenId> endTag;
List<PHPTokenId> lookforEndTokens = Arrays.asList(PHPTokenId.PHP_HEREDOC_TAG_END, PHPTokenId.PHP_NOWDOC_TAG_END);
while (ts.movePrevious()
&& (endTag = LexUtilities.findPreviousToken(ts, lookforEndTokens)) != null) {
String endId = endTag.text().toString();
// indentation of closing marker
int offset = ts.offset();
if (endId.contains(" ") || endId.contains("\t")) { // NOI18N
createError(offset, offset + endId.length());
}
// new line of closing marker
if (ts.moveNext()) {
Token<PHPTokenId> newLine = ts.token();
if (newLine != null) {
if (TokenUtilities.startsWith(newLine.text(), "\r") // NOI18N
|| (TokenUtilities.startsWith(newLine.text(), "\n") // NOI18N
|| TokenUtilities.textEquals(newLine.text(), ";"))) { // NOI18N
// noop
} else {
createError(ts.offset(), ts.offset() + newLine.length());
}
}
}
ts.move(offset);
}
}

private void createError(ASTNode node) {
createError(node.getStartOffset(), node.getEndOffset());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,27 +11,29 @@ token #9 WHITESPACE
token #10 PHP_HEREDOC_TAG_START <<<ENDOFHEREDOC\n
token #11 PHP_CONSTANT_ENCAPSED_STRING This is a heredoc test.
token #12 PHP_CONSTANT_ENCAPSED_STRING \n
token #13 PHP_HEREDOC_TAG_END \nENDOFHEREDOC
token #14 PHP_SEMICOLON ;
token #15 WHITESPACE \n\n
token #16 PHP_VARIABLE $x
token #17 WHITESPACE
token #18 PHP_OPERATOR =
token #19 WHITESPACE
token #20 PHP_HEREDOC_TAG_START <<<ENDOFHEREDOC\n
token #21 PHP_CONSTANT_ENCAPSED_STRING This is another heredoc test.
token #22 PHP_CONSTANT_ENCAPSED_STRING \n
token #23 PHP_HEREDOC_TAG_END \nENDOFHEREDOC
token #24 PHP_SEMICOLON ;
token #25 WHITESPACE \n\n
token #26 PHP_PRINT print
token #27 WHITESPACE
token #28 PHP_CONSTANT_ENCAPSED_STRING "
token #29 PHP_CURLY_OPEN {
token #30 PHP_VARIABLE $x
token #31 PHP_CURLY_CLOSE }
token #32 PHP_CONSTANT_ENCAPSED_STRING "
token #33 PHP_SEMICOLON ;
token #34 WHITESPACE \n\n
token #35 PHP_CLOSETAG ?>
token #36 T_INLINE_HTML \n--EXPECT--\nThis is a heredoc test.\nThis is another heredoc test.\n
token #13 PHP_CONSTANT_ENCAPSED_STRING \n
token #14 PHP_HEREDOC_TAG_END ENDOFHEREDOC
token #15 PHP_SEMICOLON ;
token #16 WHITESPACE \n\n
token #17 PHP_VARIABLE $x
token #18 WHITESPACE
token #19 PHP_OPERATOR =
token #20 WHITESPACE
token #21 PHP_HEREDOC_TAG_START <<<ENDOFHEREDOC\n
token #22 PHP_CONSTANT_ENCAPSED_STRING This is another heredoc test.
token #23 PHP_CONSTANT_ENCAPSED_STRING \n
token #24 PHP_CONSTANT_ENCAPSED_STRING \n
token #25 PHP_HEREDOC_TAG_END ENDOFHEREDOC
token #26 PHP_SEMICOLON ;
token #27 WHITESPACE \n\n
token #28 PHP_PRINT print
token #29 WHITESPACE
token #30 PHP_CONSTANT_ENCAPSED_STRING "
token #31 PHP_CURLY_OPEN {
token #32 PHP_VARIABLE $x
token #33 PHP_CURLY_CLOSE }
token #34 PHP_CONSTANT_ENCAPSED_STRING "
token #35 PHP_SEMICOLON ;
token #36 WHITESPACE \n\n
token #37 PHP_CLOSETAG ?>
token #38 T_INLINE_HTML \n--EXPECT--\nThis is a heredoc test.\nThis is another heredoc test.\n
Original file line number Diff line number Diff line change
Expand Up @@ -11,27 +11,29 @@ token #9 WHITESPACE
token #10 PHP_HEREDOC_TAG_START b<<<ENDOFHEREDOC\n
token #11 PHP_CONSTANT_ENCAPSED_STRING This is a heredoc test.
token #12 PHP_CONSTANT_ENCAPSED_STRING \n
token #13 PHP_HEREDOC_TAG_END \nENDOFHEREDOC
token #14 PHP_SEMICOLON ;
token #15 WHITESPACE \n\n
token #16 PHP_VARIABLE $x
token #17 WHITESPACE
token #18 PHP_OPERATOR =
token #19 WHITESPACE
token #20 PHP_HEREDOC_TAG_START b<<<ENDOFHEREDOC\n
token #21 PHP_CONSTANT_ENCAPSED_STRING This is another heredoc test.
token #22 PHP_CONSTANT_ENCAPSED_STRING \n
token #23 PHP_HEREDOC_TAG_END \nENDOFHEREDOC
token #24 PHP_SEMICOLON ;
token #25 WHITESPACE \n\n
token #26 PHP_PRINT print
token #27 WHITESPACE
token #28 PHP_CONSTANT_ENCAPSED_STRING "
token #29 PHP_CURLY_OPEN {
token #30 PHP_VARIABLE $x
token #31 PHP_CURLY_CLOSE }
token #32 PHP_CONSTANT_ENCAPSED_STRING "
token #33 PHP_SEMICOLON ;
token #34 WHITESPACE \n\n
token #35 PHP_CLOSETAG ?>
token #36 T_INLINE_HTML \n--EXPECT--\nThis is a heredoc test.\nThis is another heredoc test.\n
token #13 PHP_CONSTANT_ENCAPSED_STRING \n
token #14 PHP_HEREDOC_TAG_END ENDOFHEREDOC
token #15 PHP_SEMICOLON ;
token #16 WHITESPACE \n\n
token #17 PHP_VARIABLE $x
token #18 WHITESPACE
token #19 PHP_OPERATOR =
token #20 WHITESPACE
token #21 PHP_HEREDOC_TAG_START b<<<ENDOFHEREDOC\n
token #22 PHP_CONSTANT_ENCAPSED_STRING This is another heredoc test.
token #23 PHP_CONSTANT_ENCAPSED_STRING \n
token #24 PHP_CONSTANT_ENCAPSED_STRING \n
token #25 PHP_HEREDOC_TAG_END ENDOFHEREDOC
token #26 PHP_SEMICOLON ;
token #27 WHITESPACE \n\n
token #28 PHP_PRINT print
token #29 WHITESPACE
token #30 PHP_CONSTANT_ENCAPSED_STRING "
token #31 PHP_CURLY_OPEN {
token #32 PHP_VARIABLE $x
token #33 PHP_CURLY_CLOSE }
token #34 PHP_CONSTANT_ENCAPSED_STRING "
token #35 PHP_SEMICOLON ;
token #36 WHITESPACE \n\n
token #37 PHP_CLOSETAG ?>
token #38 T_INLINE_HTML \n--EXPECT--\nThis is a heredoc test.\nThis is another heredoc test.\n
Original file line number Diff line number Diff line change
Expand Up @@ -13,29 +13,31 @@ token #11 PHP_ENCAPSED_AND_WHITESPACE This is heredoc test #
token #12 PHP_VARIABLE $a
token #13 PHP_CONSTANT_ENCAPSED_STRING .
token #14 PHP_CONSTANT_ENCAPSED_STRING \n
token #15 PHP_HEREDOC_TAG_END \nENDOFHEREDOC
token #16 PHP_SEMICOLON ;
token #17 WHITESPACE \n\n
token #18 PHP_VARIABLE $x
token #19 WHITESPACE
token #20 PHP_OPERATOR =
token #21 WHITESPACE
token #22 PHP_HEREDOC_TAG_START <<<ENDOFHEREDOC\n
token #23 PHP_ENCAPSED_AND_WHITESPACE This is heredoc test #
token #24 PHP_VARIABLE $b
token #25 PHP_CONSTANT_ENCAPSED_STRING .
token #26 PHP_CONSTANT_ENCAPSED_STRING \n
token #27 PHP_HEREDOC_TAG_END \nENDOFHEREDOC
token #28 PHP_SEMICOLON ;
token #29 WHITESPACE \n\n
token #30 PHP_PRINT print
token #31 WHITESPACE
token #32 PHP_CONSTANT_ENCAPSED_STRING "
token #33 PHP_CURLY_OPEN {
token #34 PHP_VARIABLE $x
token #35 PHP_CURLY_CLOSE }
token #36 PHP_CONSTANT_ENCAPSED_STRING "
token #37 PHP_SEMICOLON ;
token #38 WHITESPACE \n\n
token #39 PHP_CLOSETAG ?>
token #40 T_INLINE_HTML \n--EXPECT--\nThis is heredoc test #1.\nThis is heredoc test #2.\n
token #15 PHP_CONSTANT_ENCAPSED_STRING \n
token #16 PHP_HEREDOC_TAG_END ENDOFHEREDOC
token #17 PHP_SEMICOLON ;
token #18 WHITESPACE \n\n
token #19 PHP_VARIABLE $x
token #20 WHITESPACE
token #21 PHP_OPERATOR =
token #22 WHITESPACE
token #23 PHP_HEREDOC_TAG_START <<<ENDOFHEREDOC\n
token #24 PHP_ENCAPSED_AND_WHITESPACE This is heredoc test #
token #25 PHP_VARIABLE $b
token #26 PHP_CONSTANT_ENCAPSED_STRING .
token #27 PHP_CONSTANT_ENCAPSED_STRING \n
token #28 PHP_CONSTANT_ENCAPSED_STRING \n
token #29 PHP_HEREDOC_TAG_END ENDOFHEREDOC
token #30 PHP_SEMICOLON ;
token #31 WHITESPACE \n\n
token #32 PHP_PRINT print
token #33 WHITESPACE
token #34 PHP_CONSTANT_ENCAPSED_STRING "
token #35 PHP_CURLY_OPEN {
token #36 PHP_VARIABLE $x
token #37 PHP_CURLY_CLOSE }
token #38 PHP_CONSTANT_ENCAPSED_STRING "
token #39 PHP_SEMICOLON ;
token #40 WHITESPACE \n\n
token #41 PHP_CLOSETAG ?>
token #42 T_INLINE_HTML \n--EXPECT--\nThis is heredoc test #1.\nThis is heredoc test #2.\n
Original file line number Diff line number Diff line change
Expand Up @@ -15,31 +15,33 @@ token #13 PHP_VARIABLE $a
token #14 PHP_CURLY_CLOSE }
token #15 PHP_CONSTANT_ENCAPSED_STRING .
token #16 PHP_CONSTANT_ENCAPSED_STRING \n
token #17 PHP_HEREDOC_TAG_END \nENDOFHEREDOC
token #18 PHP_SEMICOLON ;
token #19 WHITESPACE \n\n
token #20 PHP_VARIABLE $x
token #21 WHITESPACE
token #22 PHP_OPERATOR =
token #23 WHITESPACE
token #24 PHP_HEREDOC_TAG_START <<<ENDOFHEREDOC\n
token #25 PHP_ENCAPSED_AND_WHITESPACE This is heredoc test #
token #26 PHP_CURLY_OPEN {
token #27 PHP_VARIABLE $b
token #28 PHP_CURLY_CLOSE }
token #29 PHP_CONSTANT_ENCAPSED_STRING .
token #30 PHP_CONSTANT_ENCAPSED_STRING \n
token #31 PHP_HEREDOC_TAG_END \nENDOFHEREDOC
token #32 PHP_SEMICOLON ;
token #33 WHITESPACE \n\n
token #34 PHP_PRINT print
token #35 WHITESPACE
token #36 PHP_CONSTANT_ENCAPSED_STRING "
token #37 PHP_CURLY_OPEN {
token #38 PHP_VARIABLE $x
token #39 PHP_CURLY_CLOSE }
token #40 PHP_CONSTANT_ENCAPSED_STRING "
token #41 PHP_SEMICOLON ;
token #42 WHITESPACE \n\n
token #43 PHP_CLOSETAG ?>
token #44 T_INLINE_HTML \n--EXPECT--\nThis is heredoc test #1.\nThis is heredoc test #2.\n
token #17 PHP_CONSTANT_ENCAPSED_STRING \n
token #18 PHP_HEREDOC_TAG_END ENDOFHEREDOC
token #19 PHP_SEMICOLON ;
token #20 WHITESPACE \n\n
token #21 PHP_VARIABLE $x
token #22 WHITESPACE
token #23 PHP_OPERATOR =
token #24 WHITESPACE
token #25 PHP_HEREDOC_TAG_START <<<ENDOFHEREDOC\n
token #26 PHP_ENCAPSED_AND_WHITESPACE This is heredoc test #
token #27 PHP_CURLY_OPEN {
token #28 PHP_VARIABLE $b
token #29 PHP_CURLY_CLOSE }
token #30 PHP_CONSTANT_ENCAPSED_STRING .
token #31 PHP_CONSTANT_ENCAPSED_STRING \n
token #32 PHP_CONSTANT_ENCAPSED_STRING \n
token #33 PHP_HEREDOC_TAG_END ENDOFHEREDOC
token #34 PHP_SEMICOLON ;
token #35 WHITESPACE \n\n
token #36 PHP_PRINT print
token #37 WHITESPACE
token #38 PHP_CONSTANT_ENCAPSED_STRING "
token #39 PHP_CURLY_OPEN {
token #40 PHP_VARIABLE $x
token #41 PHP_CURLY_CLOSE }
token #42 PHP_CONSTANT_ENCAPSED_STRING "
token #43 PHP_SEMICOLON ;
token #44 WHITESPACE \n\n
token #45 PHP_CLOSETAG ?>
token #46 T_INLINE_HTML \n--EXPECT--\nThis is heredoc test #1.\nThis is heredoc test #2.\n
Loading