diff --git a/core/org.eclipse.cdt.core.tests/resources/rewrite/CommentHandlingTestSource.rts b/core/org.eclipse.cdt.core.tests/resources/rewrite/CommentHandlingTestSource.rts index 834c12d3ecb..443348952a6 100644 --- a/core/org.eclipse.cdt.core.tests/resources/rewrite/CommentHandlingTestSource.rts +++ b/core/org.eclipse.cdt.core.tests/resources/rewrite/CommentHandlingTestSource.rts @@ -2960,3 +2960,97 @@ void Demo::methode3() { } = /*Am Schluss*/ +//!CommentRecognitionAtTheBeginningBeforePreprocessorStatement 1 +//#org.eclipse.cdt.core.parser.tests.rewrite.comenthandler.CommentHandlingTest +//@test.h +//TEST +#ifndef TEST_H_ +#define TEST_H_ + +class test +{ +}; + +#endif + +//= +=>leading +=>trailing +=>freestanding + +//!CommentRecognitionAtTheBeginningBeforePreprocessorStatement 2 +//#org.eclipse.cdt.core.parser.tests.rewrite.comenthandler.CommentHandlingTest +//@test.h +/* + * Licence information... + */ + +#ifndef TEST_H_ +#define TEST_H_ + +class test +{ +}; + +#endif + +//= +=>leading +=>trailing +=>freestanding + +//!CommentRecognitionAtTheBeginningBeforePreprocessorStatement 3 +//#org.eclipse.cdt.core.parser.tests.rewrite.comenthandler.CommentHandlingTest +//@test.h +/* + * Licence information... + */ + +#ifndef TEST_H_ +#define TEST_H_ + +//test +class test +{ +}; + +#endif + +//= +=>leading +class test +{ +}; = //test +=>trailing +=>freestanding + +//!CommentRecognitionAtTheBeginningBeforePreprocessorStatement 4 +//#org.eclipse.cdt.core.parser.tests.rewrite.comenthandler.CommentHandlingTest +//@test.h +/* + * HideMethod.h + */ + +#ifndef HIDEMETHOD_H_ +#define HIDEMETHOD_H_ + + +class HideMethod { +public: + HideMethod(); + virtual ~HideMethod(); + void methode2(); + void methode3(); + +private: + int i; + bool isOk; +}; + +#endif /* HIDEMETHOD_H_ */ + +//= +=>leading +=>trailing +=>freestanding + diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/commenthandler/ASTCommenter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/commenthandler/ASTCommenter.java index b3f17609b50..53aa8250704 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/commenthandler/ASTCommenter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/commenthandler/ASTCommenter.java @@ -12,6 +12,7 @@ package org.eclipse.cdt.internal.core.dom.rewrite.commenthandler; import java.util.ArrayList; +import java.util.Collections; import java.util.TreeMap; import org.eclipse.cdt.core.dom.ast.IASTComment; @@ -83,10 +84,12 @@ public class ASTCommenter { private static ArrayList removeAllPreprocessorComments(IASTTranslationUnit tu, ArrayList comments) { IASTPreprocessorStatement[] preprocessorStatements = tu.getAllPreprocessorStatements(); TreeMap treeOfPreProcessorLines = new TreeMap(); + ArrayList listOfPreProcessorOffset = new ArrayList(); for (IASTPreprocessorStatement statement : preprocessorStatements) { if (isInWorkspace(statement)) { treeOfPreProcessorLines.put(OffsetHelper.getStartingLineNumber(statement),null); + listOfPreProcessorOffset.add(statement.getFileLocation().getNodeOffset()); } } @@ -96,11 +99,41 @@ public class ASTCommenter { if (treeOfPreProcessorLines.containsKey(comStartLineNumber)) { continue; } + if(commentIsAtTheBeginningBeforePreprocessorStatements(comment, listOfPreProcessorOffset)) { + continue; + } commentsInCode.add(comment); } return commentsInCode; } + private static boolean commentIsAtTheBeginningBeforePreprocessorStatements( + IASTComment comment, + ArrayList listOfPreProcessorOffset) { + if(listOfPreProcessorOffset.size() <1) { + return false; + } + + if(comment.getTranslationUnit()==null || comment.getTranslationUnit().getDeclarations().length < 1) { + return true; + } + IASTDeclaration decl = comment.getTranslationUnit().getDeclarations()[0]; + if(decl.getFileLocation().getNodeOffset() < comment.getFileLocation().getNodeOffset()) { + return false; + } + + Collections.sort(listOfPreProcessorOffset); + if(listOfPreProcessorOffset.get(0) < comment.getFileLocation().getNodeOffset()) { + return false; + } + + if(listOfPreProcessorOffset.get(0) < decl.getFileLocation().getNodeOffset()) { + return true; + } + + return false; + } + private static boolean isInWorkspace(IASTNode node) { IPath workspacePath = Platform.getLocation(); IPath nodePath = new Path(node.getContainingFilename());