tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceParser.java
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
parent 41 tracefw/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/source/SourceParser.java@838cdffd57ce
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
41
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
* Parser for C++ source files
hgs
parents:
diff changeset
    17
*
hgs
parents:
diff changeset
    18
*/
hgs
parents:
diff changeset
    19
package com.nokia.tracecompiler.source;
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
import java.util.ArrayList;
hgs
parents:
diff changeset
    22
import java.util.List;
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
/**
hgs
parents:
diff changeset
    25
 * Parser for C++ source files. Commented and quoted areas are located during
hgs
parents:
diff changeset
    26
 * the construction of this object and those areas are excluded from the
hgs
parents:
diff changeset
    27
 * searches.
hgs
parents:
diff changeset
    28
 * 
hgs
parents:
diff changeset
    29
 */
hgs
parents:
diff changeset
    30
public class SourceParser {
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
	/**
hgs
parents:
diff changeset
    33
	 * Skip white spaces. Does not apply to string searches
hgs
parents:
diff changeset
    34
	 */
hgs
parents:
diff changeset
    35
	public final static int SKIP_WHITE_SPACES = 0x01; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
	/**
hgs
parents:
diff changeset
    38
	 * Skip string areas
hgs
parents:
diff changeset
    39
	 */
hgs
parents:
diff changeset
    40
	public final static int SKIP_STRINGS = 0x02; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
    41
hgs
parents:
diff changeset
    42
	/**
hgs
parents:
diff changeset
    43
	 * Search / iterate backwards
hgs
parents:
diff changeset
    44
	 */
hgs
parents:
diff changeset
    45
	public final static int BACKWARD_SEARCH = 0x04; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
	/**
hgs
parents:
diff changeset
    48
	 * Ignore character case in string searches
hgs
parents:
diff changeset
    49
	 */
hgs
parents:
diff changeset
    50
	public final static int IGNORE_CASE = 0x08; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
	/**
hgs
parents:
diff changeset
    53
	 * Skip commented areas
hgs
parents:
diff changeset
    54
	 */
hgs
parents:
diff changeset
    55
	public final static int SKIP_COMMENTS = 0x10; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
	/**
hgs
parents:
diff changeset
    58
	 * Skip preprocessor definitions
hgs
parents:
diff changeset
    59
	 */
hgs
parents:
diff changeset
    60
	public final static int SKIP_PREPROCESSOR = 0x80; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
    61
hgs
parents:
diff changeset
    62
	/**
hgs
parents:
diff changeset
    63
	 * Match beginning of word flag
hgs
parents:
diff changeset
    64
	 */
hgs
parents:
diff changeset
    65
	public final static int MATCH_WORD_BEGINNING = 0x20; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
	/**
hgs
parents:
diff changeset
    68
	 * Match end of word flag
hgs
parents:
diff changeset
    69
	 */
hgs
parents:
diff changeset
    70
	public final static int MATCH_WORD_END = 0x40; // CodForChk_Dis_Magic
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
	/**
hgs
parents:
diff changeset
    73
	 * Match whole word flag
hgs
parents:
diff changeset
    74
	 */
hgs
parents:
diff changeset
    75
	public final static int MATCH_WHOLE_WORD = MATCH_WORD_BEGINNING
hgs
parents:
diff changeset
    76
			| MATCH_WORD_END;
hgs
parents:
diff changeset
    77
hgs
parents:
diff changeset
    78
	/**
hgs
parents:
diff changeset
    79
	 * Ignore all special areas during search
hgs
parents:
diff changeset
    80
	 */
hgs
parents:
diff changeset
    81
	public final static int SKIP_ALL = SKIP_WHITE_SPACES | SKIP_STRINGS
hgs
parents:
diff changeset
    82
			| SKIP_COMMENTS | SKIP_PREPROCESSOR;
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
	/**
hgs
parents:
diff changeset
    85
	 * Data to be searched.
hgs
parents:
diff changeset
    86
	 */
hgs
parents:
diff changeset
    87
	private SourceDocumentInterface source;
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
	/**
hgs
parents:
diff changeset
    90
	 * List of source locations
hgs
parents:
diff changeset
    91
	 */
hgs
parents:
diff changeset
    92
	private ArrayList<SourceLocation> locations;
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
	/**
hgs
parents:
diff changeset
    95
	 * Document factory for creating locations
hgs
parents:
diff changeset
    96
	 */
hgs
parents:
diff changeset
    97
	private SourceDocumentFactory documentFactory;
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
	/**
hgs
parents:
diff changeset
   100
	 * Excluded area parser
hgs
parents:
diff changeset
   101
	 */
hgs
parents:
diff changeset
   102
	private ExcludedAreaParser excludedAreaParser;
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
	/**
hgs
parents:
diff changeset
   105
	 * Context area parser
hgs
parents:
diff changeset
   106
	 */
hgs
parents:
diff changeset
   107
	private ContextAreaParser contextAreaParser;
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
	/**
hgs
parents:
diff changeset
   110
	 * Function return value parser
hgs
parents:
diff changeset
   111
	 */
hgs
parents:
diff changeset
   112
	private FunctionReturnValueParser returnValueParser;
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
	/**
hgs
parents:
diff changeset
   115
	 * Creates a new parser for given data
hgs
parents:
diff changeset
   116
	 * 
hgs
parents:
diff changeset
   117
	 * @param factory
hgs
parents:
diff changeset
   118
	 *            the document factory
hgs
parents:
diff changeset
   119
	 * @param sourceData
hgs
parents:
diff changeset
   120
	 *            the source data
hgs
parents:
diff changeset
   121
	 */
hgs
parents:
diff changeset
   122
	public SourceParser(SourceDocumentFactory factory, String sourceData) {
hgs
parents:
diff changeset
   123
		this(factory, factory.createDocument(sourceData));
hgs
parents:
diff changeset
   124
	}
hgs
parents:
diff changeset
   125
hgs
parents:
diff changeset
   126
	/**
hgs
parents:
diff changeset
   127
	 * Creates a source parser from source document
hgs
parents:
diff changeset
   128
	 * 
hgs
parents:
diff changeset
   129
	 * @param factory
hgs
parents:
diff changeset
   130
	 *            the document factory
hgs
parents:
diff changeset
   131
	 * @param source
hgs
parents:
diff changeset
   132
	 *            the source document
hgs
parents:
diff changeset
   133
	 */
hgs
parents:
diff changeset
   134
	public SourceParser(SourceDocumentFactory factory,
hgs
parents:
diff changeset
   135
			SourceDocumentInterface source) {
hgs
parents:
diff changeset
   136
		this.documentFactory = factory;
hgs
parents:
diff changeset
   137
		this.source = source;
hgs
parents:
diff changeset
   138
		excludedAreaParser = new ExcludedAreaParser(this);
hgs
parents:
diff changeset
   139
		contextAreaParser = new ContextAreaParser(this);
hgs
parents:
diff changeset
   140
		returnValueParser = new FunctionReturnValueParser(this);
hgs
parents:
diff changeset
   141
		try {
hgs
parents:
diff changeset
   142
			findExcludedAreas();
hgs
parents:
diff changeset
   143
		} catch (SourceParserException e) {
hgs
parents:
diff changeset
   144
		}
hgs
parents:
diff changeset
   145
	}
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
	/**
hgs
parents:
diff changeset
   148
	 * Gets the source document
hgs
parents:
diff changeset
   149
	 * 
hgs
parents:
diff changeset
   150
	 * @return the source
hgs
parents:
diff changeset
   151
	 */
hgs
parents:
diff changeset
   152
	public SourceDocumentInterface getSource() {
hgs
parents:
diff changeset
   153
		return source;
hgs
parents:
diff changeset
   154
	}
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
	/**
hgs
parents:
diff changeset
   157
	 * Gets part of the source document data
hgs
parents:
diff changeset
   158
	 * 
hgs
parents:
diff changeset
   159
	 * @param start
hgs
parents:
diff changeset
   160
	 *            the start offset
hgs
parents:
diff changeset
   161
	 * @param length
hgs
parents:
diff changeset
   162
	 *            the data length
hgs
parents:
diff changeset
   163
	 * @return the data or null if offsets are not valid
hgs
parents:
diff changeset
   164
	 */
hgs
parents:
diff changeset
   165
	public String getData(int start, int length) {
hgs
parents:
diff changeset
   166
		String retval;
hgs
parents:
diff changeset
   167
		try {
hgs
parents:
diff changeset
   168
			retval = source.get(start, length);
hgs
parents:
diff changeset
   169
		} catch (SourceParserException e) {
hgs
parents:
diff changeset
   170
			retval = null;
hgs
parents:
diff changeset
   171
		}
hgs
parents:
diff changeset
   172
		return retval;
hgs
parents:
diff changeset
   173
	}
hgs
parents:
diff changeset
   174
hgs
parents:
diff changeset
   175
	/**
hgs
parents:
diff changeset
   176
	 * Gets a character at given offset
hgs
parents:
diff changeset
   177
	 * 
hgs
parents:
diff changeset
   178
	 * @param offset
hgs
parents:
diff changeset
   179
	 *            the offset
hgs
parents:
diff changeset
   180
	 * @return the character
hgs
parents:
diff changeset
   181
	 */
hgs
parents:
diff changeset
   182
	public char getData(int offset) {
hgs
parents:
diff changeset
   183
		char retval;
hgs
parents:
diff changeset
   184
		try {
hgs
parents:
diff changeset
   185
			retval = source.getChar(offset);
hgs
parents:
diff changeset
   186
		} catch (SourceParserException e) {
hgs
parents:
diff changeset
   187
			retval = '\0';
hgs
parents:
diff changeset
   188
		}
hgs
parents:
diff changeset
   189
		return retval;
hgs
parents:
diff changeset
   190
	}
hgs
parents:
diff changeset
   191
hgs
parents:
diff changeset
   192
	/**
hgs
parents:
diff changeset
   193
	 * Gets the source document length
hgs
parents:
diff changeset
   194
	 * 
hgs
parents:
diff changeset
   195
	 * @return the source length
hgs
parents:
diff changeset
   196
	 */
hgs
parents:
diff changeset
   197
	public int getDataLength() {
hgs
parents:
diff changeset
   198
		return source.getLength();
hgs
parents:
diff changeset
   199
	}
hgs
parents:
diff changeset
   200
hgs
parents:
diff changeset
   201
	/**
hgs
parents:
diff changeset
   202
	 * Gets the line number of given offset
hgs
parents:
diff changeset
   203
	 * 
hgs
parents:
diff changeset
   204
	 * @param offset
hgs
parents:
diff changeset
   205
	 *            the offset
hgs
parents:
diff changeset
   206
	 * @return the line number or -1 if offset is not valid
hgs
parents:
diff changeset
   207
	 */
hgs
parents:
diff changeset
   208
	public int getLineNumber(int offset) {
hgs
parents:
diff changeset
   209
		int retval;
hgs
parents:
diff changeset
   210
		try {
hgs
parents:
diff changeset
   211
			retval = source.getLineOfOffset(offset) + 1;
hgs
parents:
diff changeset
   212
		} catch (SourceParserException e) {
hgs
parents:
diff changeset
   213
			retval = -1;
hgs
parents:
diff changeset
   214
		}
hgs
parents:
diff changeset
   215
		return retval;
hgs
parents:
diff changeset
   216
	}
hgs
parents:
diff changeset
   217
hgs
parents:
diff changeset
   218
	/**
hgs
parents:
diff changeset
   219
	 * Starts a new string search from given offset
hgs
parents:
diff changeset
   220
	 * 
hgs
parents:
diff changeset
   221
	 * @param searchString
hgs
parents:
diff changeset
   222
	 *            the string to be searched
hgs
parents:
diff changeset
   223
	 * @param startOffset
hgs
parents:
diff changeset
   224
	 *            the offset to start of search
hgs
parents:
diff changeset
   225
	 * @param endOffset
hgs
parents:
diff changeset
   226
	 *            the end of search or -1 to search the whole document
hgs
parents:
diff changeset
   227
	 * @param searchFlags
hgs
parents:
diff changeset
   228
	 *            the search flags
hgs
parents:
diff changeset
   229
	 * @return the search object
hgs
parents:
diff changeset
   230
	 */
hgs
parents:
diff changeset
   231
	public SourceStringSearch startStringSearch(String searchString,
hgs
parents:
diff changeset
   232
			int startOffset, int endOffset, int searchFlags) {
hgs
parents:
diff changeset
   233
		return new SourceStringSearch(this, searchString, startOffset,
hgs
parents:
diff changeset
   234
				endOffset, searchFlags);
hgs
parents:
diff changeset
   235
	}
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
	/**
hgs
parents:
diff changeset
   238
	 * Tokenizes the parameter list starting from next bracket. White spaces are
hgs
parents:
diff changeset
   239
	 * discarded. For example (a, b , c ) returns { "a", "b", "c" }. This method
hgs
parents:
diff changeset
   240
	 * is independent of the current string search and thus can be used during
hgs
parents:
diff changeset
   241
	 * one.
hgs
parents:
diff changeset
   242
	 * 
hgs
parents:
diff changeset
   243
	 * @param startIndex
hgs
parents:
diff changeset
   244
	 *            the index where to start
hgs
parents:
diff changeset
   245
	 * @param list
hgs
parents:
diff changeset
   246
	 *            the list where the parameters are added
hgs
parents:
diff changeset
   247
	 * @param findSeparator
hgs
parents:
diff changeset
   248
	 *            if true, the processing stops after ';' or '{' character. If
hgs
parents:
diff changeset
   249
	 *            false, processing stops after ')' at end of parameters
hgs
parents:
diff changeset
   250
	 * @return the offset at end of the parameters
hgs
parents:
diff changeset
   251
	 * @throws SourceParserException
hgs
parents:
diff changeset
   252
	 *             if parameters are not valid
hgs
parents:
diff changeset
   253
	 */
hgs
parents:
diff changeset
   254
	public int tokenizeParameters(int startIndex, List<String> list,
hgs
parents:
diff changeset
   255
			boolean findSeparator) throws SourceParserException {
hgs
parents:
diff changeset
   256
		SourceParameterTokenizer tokenizer = new SourceParameterTokenizer(this,
hgs
parents:
diff changeset
   257
				startIndex);
hgs
parents:
diff changeset
   258
		return tokenizer.tokenize(list, findSeparator);
hgs
parents:
diff changeset
   259
	}
hgs
parents:
diff changeset
   260
hgs
parents:
diff changeset
   261
	/**
hgs
parents:
diff changeset
   262
	 * Parses the parameter list of given source context. Each entry added into
hgs
parents:
diff changeset
   263
	 * the list will be an instance of SourceParameter class. This method is
hgs
parents:
diff changeset
   264
	 * independent of the current string search and thus can be used during one.
hgs
parents:
diff changeset
   265
	 * 
hgs
parents:
diff changeset
   266
	 * @param parameterIndex
hgs
parents:
diff changeset
   267
	 *            the index where to start
hgs
parents:
diff changeset
   268
	 * @param list
hgs
parents:
diff changeset
   269
	 *            the list where the parameters are added
hgs
parents:
diff changeset
   270
	 * @return the offset at end of the parameters
hgs
parents:
diff changeset
   271
	 * @throws SourceParserException
hgs
parents:
diff changeset
   272
	 *             if context is not valid
hgs
parents:
diff changeset
   273
	 */
hgs
parents:
diff changeset
   274
	public int parseFunctionParameters(int parameterIndex, List<SourceParameter> list)
hgs
parents:
diff changeset
   275
			throws SourceParserException {
hgs
parents:
diff changeset
   276
		SourceParameterTokenizer tokenizer = new SourceParameterTokenizer(this,
hgs
parents:
diff changeset
   277
				parameterIndex);
hgs
parents:
diff changeset
   278
		return tokenizer.tokenizeTyped(list);
hgs
parents:
diff changeset
   279
	}
hgs
parents:
diff changeset
   280
hgs
parents:
diff changeset
   281
	/**
hgs
parents:
diff changeset
   282
	 * Parses the return values of given source context
hgs
parents:
diff changeset
   283
	 * 
hgs
parents:
diff changeset
   284
	 * @param context
hgs
parents:
diff changeset
   285
	 *            the context to be parsed
hgs
parents:
diff changeset
   286
	 * @param list
hgs
parents:
diff changeset
   287
	 *            the list of return values
hgs
parents:
diff changeset
   288
	 */
hgs
parents:
diff changeset
   289
	void parseReturnValues(SourceContext context, List<SourceReturn> list) {
hgs
parents:
diff changeset
   290
		returnValueParser.parseReturnValues(context, list);
hgs
parents:
diff changeset
   291
	}
hgs
parents:
diff changeset
   292
hgs
parents:
diff changeset
   293
	/**
hgs
parents:
diff changeset
   294
	 * Checks if the offset if within an excluded area
hgs
parents:
diff changeset
   295
	 * 
hgs
parents:
diff changeset
   296
	 * @param offset
hgs
parents:
diff changeset
   297
	 *            the offset
hgs
parents:
diff changeset
   298
	 * @return true if in excluded area
hgs
parents:
diff changeset
   299
	 */
hgs
parents:
diff changeset
   300
	public boolean isInExcludedArea(int offset) {
hgs
parents:
diff changeset
   301
		return findExcludedAreaIndex(offset) >= 0;
hgs
parents:
diff changeset
   302
	}
hgs
parents:
diff changeset
   303
hgs
parents:
diff changeset
   304
	/**
hgs
parents:
diff changeset
   305
	 * Gets an excluded area
hgs
parents:
diff changeset
   306
	 * 
hgs
parents:
diff changeset
   307
	 * @param offset
hgs
parents:
diff changeset
   308
	 *            the data offset
hgs
parents:
diff changeset
   309
	 * @return the area or null
hgs
parents:
diff changeset
   310
	 */
hgs
parents:
diff changeset
   311
	public SourceExcludedArea getExcludedArea(int offset) {
hgs
parents:
diff changeset
   312
		return excludedAreaParser.getArea(offset);
hgs
parents:
diff changeset
   313
	}
hgs
parents:
diff changeset
   314
hgs
parents:
diff changeset
   315
	/**
hgs
parents:
diff changeset
   316
	 * Creates a new source iterator
hgs
parents:
diff changeset
   317
	 * 
hgs
parents:
diff changeset
   318
	 * @param offset
hgs
parents:
diff changeset
   319
	 *            the offset where to start
hgs
parents:
diff changeset
   320
	 * @param iteratorFlags
hgs
parents:
diff changeset
   321
	 *            the flags for the iterator
hgs
parents:
diff changeset
   322
	 * @return the new iterator
hgs
parents:
diff changeset
   323
	 */
hgs
parents:
diff changeset
   324
	public SourceIterator createIterator(int offset, int iteratorFlags) {
hgs
parents:
diff changeset
   325
		return new SourceIterator(this, offset, iteratorFlags);
hgs
parents:
diff changeset
   326
	}
hgs
parents:
diff changeset
   327
hgs
parents:
diff changeset
   328
	/**
hgs
parents:
diff changeset
   329
	 * Returns the context at given offset. This parses the source if it has not
hgs
parents:
diff changeset
   330
	 * been parsed before.
hgs
parents:
diff changeset
   331
	 * 
hgs
parents:
diff changeset
   332
	 * @param offset
hgs
parents:
diff changeset
   333
	 *            the offset to the source data
hgs
parents:
diff changeset
   334
	 * @return the context at the offset or null if no context exists
hgs
parents:
diff changeset
   335
	 */
hgs
parents:
diff changeset
   336
	public SourceContext getContext(int offset) {
hgs
parents:
diff changeset
   337
		SourceContext retval;
hgs
parents:
diff changeset
   338
		try {
hgs
parents:
diff changeset
   339
			retval = contextAreaParser.parseAndGet(offset);
hgs
parents:
diff changeset
   340
		} catch (SourceParserException e) {
hgs
parents:
diff changeset
   341
			retval = null;
hgs
parents:
diff changeset
   342
		}
hgs
parents:
diff changeset
   343
		return retval;
hgs
parents:
diff changeset
   344
	}
hgs
parents:
diff changeset
   345
hgs
parents:
diff changeset
   346
	/**
hgs
parents:
diff changeset
   347
	 * Locates the start-of-line starting from given offset
hgs
parents:
diff changeset
   348
	 * 
hgs
parents:
diff changeset
   349
	 * @param offset
hgs
parents:
diff changeset
   350
	 *            the offset
hgs
parents:
diff changeset
   351
	 * @param cancelIfNotWhitespace
hgs
parents:
diff changeset
   352
	 *            flag that tells to stop processing and return the original
hgs
parents:
diff changeset
   353
	 *            value if a non-whitespace is found before start of line
hgs
parents:
diff changeset
   354
	 * @param stayInContext
hgs
parents:
diff changeset
   355
	 *            flag that tells to stay within the context offset currently
hgs
parents:
diff changeset
   356
	 *            resides. If this would come out of the context, this locates
hgs
parents:
diff changeset
   357
	 *            the start of the next line following offset
hgs
parents:
diff changeset
   358
	 * @return the start-of-line
hgs
parents:
diff changeset
   359
	 * @throws SourceParserException
hgs
parents:
diff changeset
   360
	 *             if the offset is not valid
hgs
parents:
diff changeset
   361
	 */
hgs
parents:
diff changeset
   362
	public int findStartOfLine(int offset, boolean cancelIfNotWhitespace,
hgs
parents:
diff changeset
   363
			boolean stayInContext) throws SourceParserException {
hgs
parents:
diff changeset
   364
		int retval = offset == 0 ? offset : offset - 1;
hgs
parents:
diff changeset
   365
		for (int i = retval; i >= 0; i--) {
hgs
parents:
diff changeset
   366
			char c = source.getChar(i);
hgs
parents:
diff changeset
   367
			if (source.getChar(i) == '\n') {
hgs
parents:
diff changeset
   368
				retval = i + 1;
hgs
parents:
diff changeset
   369
				i = -1;
hgs
parents:
diff changeset
   370
			} else if (cancelIfNotWhitespace && !Character.isWhitespace(c)) {
hgs
parents:
diff changeset
   371
				retval = offset;
hgs
parents:
diff changeset
   372
				i = -1;
hgs
parents:
diff changeset
   373
			}
hgs
parents:
diff changeset
   374
		}
hgs
parents:
diff changeset
   375
		if (stayInContext) {
hgs
parents:
diff changeset
   376
			SourceContext context = getContext(offset);
hgs
parents:
diff changeset
   377
			if (context != null && retval < context.getOffset()) {
hgs
parents:
diff changeset
   378
				retval = context.getOffset();
hgs
parents:
diff changeset
   379
				int end = context.getOffset() + context.getLength();
hgs
parents:
diff changeset
   380
				for (int i = retval; i < end; i++) {
hgs
parents:
diff changeset
   381
					if (source.getChar(i) == '\n') {
hgs
parents:
diff changeset
   382
						retval = i + 1;
hgs
parents:
diff changeset
   383
						i = end;
hgs
parents:
diff changeset
   384
					}
hgs
parents:
diff changeset
   385
				}
hgs
parents:
diff changeset
   386
			}
hgs
parents:
diff changeset
   387
		}
hgs
parents:
diff changeset
   388
		return retval;
hgs
parents:
diff changeset
   389
	}
hgs
parents:
diff changeset
   390
hgs
parents:
diff changeset
   391
	/**
hgs
parents:
diff changeset
   392
	 * Finds the array index of the excluded area which contains the offset. If
hgs
parents:
diff changeset
   393
	 * none of the areas contain the offset, returns negative integer indicating
hgs
parents:
diff changeset
   394
	 * the index of the excluded area following the offset
hgs
parents:
diff changeset
   395
	 * 
hgs
parents:
diff changeset
   396
	 * @param offset
hgs
parents:
diff changeset
   397
	 *            the offset to the data
hgs
parents:
diff changeset
   398
	 * @return the excluded area index
hgs
parents:
diff changeset
   399
	 */
hgs
parents:
diff changeset
   400
	int findExcludedAreaIndex(int offset) {
hgs
parents:
diff changeset
   401
		return excludedAreaParser.find(offset);
hgs
parents:
diff changeset
   402
	}
hgs
parents:
diff changeset
   403
hgs
parents:
diff changeset
   404
	/**
hgs
parents:
diff changeset
   405
	 * Finds the excluded source file areas. Excluded areas include comments and
hgs
parents:
diff changeset
   406
	 * quoted strings. Overwrites possible old areas.
hgs
parents:
diff changeset
   407
	 * 
hgs
parents:
diff changeset
   408
	 * @throws SourceParserException
hgs
parents:
diff changeset
   409
	 *             if parser fails
hgs
parents:
diff changeset
   410
	 */
hgs
parents:
diff changeset
   411
	public void findExcludedAreas() throws SourceParserException {
hgs
parents:
diff changeset
   412
		excludedAreaParser.parseAll();
hgs
parents:
diff changeset
   413
	}
hgs
parents:
diff changeset
   414
hgs
parents:
diff changeset
   415
	/**
hgs
parents:
diff changeset
   416
	 * Gets the list of excluded areas
hgs
parents:
diff changeset
   417
	 * 
hgs
parents:
diff changeset
   418
	 * @return the list
hgs
parents:
diff changeset
   419
	 */
hgs
parents:
diff changeset
   420
	public List<SourceExcludedArea> getExcludedAreas() {
hgs
parents:
diff changeset
   421
		return excludedAreaParser.getAreas();
hgs
parents:
diff changeset
   422
	}
hgs
parents:
diff changeset
   423
hgs
parents:
diff changeset
   424
	/**
hgs
parents:
diff changeset
   425
	 * Checks if the area is excluded with given flags
hgs
parents:
diff changeset
   426
	 * 
hgs
parents:
diff changeset
   427
	 * @param type
hgs
parents:
diff changeset
   428
	 *            the area type
hgs
parents:
diff changeset
   429
	 * @param flags
hgs
parents:
diff changeset
   430
	 *            the flags
hgs
parents:
diff changeset
   431
	 * @return true if skipped
hgs
parents:
diff changeset
   432
	 */
hgs
parents:
diff changeset
   433
	static boolean isExcluded(int type, int flags) {
hgs
parents:
diff changeset
   434
		boolean string = ((flags & SKIP_STRINGS) != 0)
hgs
parents:
diff changeset
   435
				&& (type == SourceExcludedArea.STRING);
hgs
parents:
diff changeset
   436
		boolean comment = ((flags & SKIP_COMMENTS) != 0)
hgs
parents:
diff changeset
   437
				&& (type == SourceExcludedArea.MULTILINE_COMMENT);
hgs
parents:
diff changeset
   438
		boolean linecomment = ((flags & SKIP_COMMENTS) != 0)
hgs
parents:
diff changeset
   439
				&& (type == SourceExcludedArea.LINE_COMMENT);
hgs
parents:
diff changeset
   440
		boolean preProcessor = ((flags & SKIP_PREPROCESSOR) != 0)
hgs
parents:
diff changeset
   441
				&& (type == SourceExcludedArea.PREPROCESSOR_DEFINITION);
hgs
parents:
diff changeset
   442
		return string || comment || linecomment || preProcessor;
hgs
parents:
diff changeset
   443
	}
hgs
parents:
diff changeset
   444
hgs
parents:
diff changeset
   445
	/**
hgs
parents:
diff changeset
   446
	 * Adds a location to this parser
hgs
parents:
diff changeset
   447
	 * 
hgs
parents:
diff changeset
   448
	 * @param location
hgs
parents:
diff changeset
   449
	 *            the location
hgs
parents:
diff changeset
   450
	 */
hgs
parents:
diff changeset
   451
	void addLocation(SourceLocation location) {
hgs
parents:
diff changeset
   452
		if (locations == null) {
hgs
parents:
diff changeset
   453
			locations = new ArrayList<SourceLocation>();
hgs
parents:
diff changeset
   454
		}
hgs
parents:
diff changeset
   455
		locations.add(location);
hgs
parents:
diff changeset
   456
		if (source != null) {
hgs
parents:
diff changeset
   457
			source.addLocation(location.getLocation());
hgs
parents:
diff changeset
   458
		}
hgs
parents:
diff changeset
   459
	}
hgs
parents:
diff changeset
   460
hgs
parents:
diff changeset
   461
	/**
hgs
parents:
diff changeset
   462
	 * Removes a location from this parser
hgs
parents:
diff changeset
   463
	 * 
hgs
parents:
diff changeset
   464
	 * @param location
hgs
parents:
diff changeset
   465
	 *            the location to be removed
hgs
parents:
diff changeset
   466
	 */
hgs
parents:
diff changeset
   467
	void removeLocation(SourceLocation location) {
hgs
parents:
diff changeset
   468
		if (locations != null) {
hgs
parents:
diff changeset
   469
			locations.remove(location);
hgs
parents:
diff changeset
   470
		}
hgs
parents:
diff changeset
   471
		if (source != null) {
hgs
parents:
diff changeset
   472
			source.removeLocation(location.getLocation());
hgs
parents:
diff changeset
   473
		}
hgs
parents:
diff changeset
   474
	}
hgs
parents:
diff changeset
   475
hgs
parents:
diff changeset
   476
	/**
hgs
parents:
diff changeset
   477
	 * Gets the document framework
hgs
parents:
diff changeset
   478
	 * 
hgs
parents:
diff changeset
   479
	 * @return the document framework
hgs
parents:
diff changeset
   480
	 */
hgs
parents:
diff changeset
   481
	public SourceDocumentFactory getDocumentFramework() {
hgs
parents:
diff changeset
   482
		return documentFactory;
hgs
parents:
diff changeset
   483
	}
hgs
parents:
diff changeset
   484
hgs
parents:
diff changeset
   485
}