tracesrv/tracecompiler/src/com.nokia.tracecompiler/src/com/nokia/tracecompiler/engine/rules/SourceParserRuleBase.java
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
56
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2007 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
* Implementation of parser rule
hgs
parents:
diff changeset
    17
*
hgs
parents:
diff changeset
    18
*/
hgs
parents:
diff changeset
    19
package com.nokia.tracecompiler.engine.rules;
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
import java.util.ArrayList;
hgs
parents:
diff changeset
    22
import java.util.Iterator;
hgs
parents:
diff changeset
    23
import java.util.List;
hgs
parents:
diff changeset
    24
import java.util.regex.Matcher;
hgs
parents:
diff changeset
    25
import java.util.regex.Pattern;
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
import com.nokia.tracecompiler.engine.TraceLocation;
hgs
parents:
diff changeset
    28
import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.StringErrorParameters;
hgs
parents:
diff changeset
    29
import com.nokia.tracecompiler.engine.TraceCompilerEngineErrorCodes.TraceCompilerErrorCode;
hgs
parents:
diff changeset
    30
import com.nokia.tracecompiler.engine.source.SourceParserResult;
hgs
parents:
diff changeset
    31
import com.nokia.tracecompiler.engine.source.SourceParserRule;
hgs
parents:
diff changeset
    32
import com.nokia.tracecompiler.engine.utils.TraceUtils;
hgs
parents:
diff changeset
    33
import com.nokia.tracecompiler.model.Trace;
hgs
parents:
diff changeset
    34
import com.nokia.tracecompiler.model.TraceCompilerException;
hgs
parents:
diff changeset
    35
import com.nokia.tracecompiler.model.TraceModelExtension;
hgs
parents:
diff changeset
    36
import com.nokia.tracecompiler.project.TraceLocationParser;
hgs
parents:
diff changeset
    37
import com.nokia.tracecompiler.project.TraceProjectAPI;
hgs
parents:
diff changeset
    38
import com.nokia.tracecompiler.source.FormatMapping;
hgs
parents:
diff changeset
    39
import com.nokia.tracecompiler.source.SourceConstants;
hgs
parents:
diff changeset
    40
import com.nokia.tracecompiler.source.SourceExcludedArea;
hgs
parents:
diff changeset
    41
import com.nokia.tracecompiler.source.SourceIterator;
hgs
parents:
diff changeset
    42
import com.nokia.tracecompiler.source.SourceParser;
hgs
parents:
diff changeset
    43
import com.nokia.tracecompiler.source.SourceParserException;
hgs
parents:
diff changeset
    44
import com.nokia.tracecompiler.source.SourceUtils;
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
/**
hgs
parents:
diff changeset
    47
 * Base class for parser rules. Instances of this class are added to the trace
hgs
parents:
diff changeset
    48
 * model. The source engine uses the parses it finds from the model to find
hgs
parents:
diff changeset
    49
 * trace locations from source files
hgs
parents:
diff changeset
    50
 * 
hgs
parents:
diff changeset
    51
 */
hgs
parents:
diff changeset
    52
public abstract class SourceParserRuleBase extends RuleBase implements
hgs
parents:
diff changeset
    53
		SourceParserRule, TraceLocationParser {
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
	/**
hgs
parents:
diff changeset
    56
	 * Tag to be searched from source
hgs
parents:
diff changeset
    57
	 */
hgs
parents:
diff changeset
    58
	private String tag;
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
	/**
hgs
parents:
diff changeset
    61
	 * Allowed tag suffixes
hgs
parents:
diff changeset
    62
	 */
hgs
parents:
diff changeset
    63
	private ArrayList<String> tagSuffixes = new ArrayList<String>();
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
	/**
hgs
parents:
diff changeset
    66
	 * Default name for a parameter
hgs
parents:
diff changeset
    67
	 */
hgs
parents:
diff changeset
    68
	public static final String DEFAULT_PARAMETER_NAME = "arg"; //$NON-NLS-1$
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
	/**
hgs
parents:
diff changeset
    71
	 * Pattern for trimming c++ cast operator away from trace parameters
hgs
parents:
diff changeset
    72
	 */
hgs
parents:
diff changeset
    73
	private Pattern cppCastTrimPattern = Pattern.compile("\\s*(.+<.+>)\\s*"); //$NON-NLS-1$
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
	/**
hgs
parents:
diff changeset
    76
	 * Pattern for trimming c cast operator away from trace parameters
hgs
parents:
diff changeset
    77
	 */
hgs
parents:
diff changeset
    78
	private Pattern cCastTrimPattern = Pattern.compile("(\\([^(]+?\\))"); //$NON-NLS-1$
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
	/**
hgs
parents:
diff changeset
    81
	 * Pattern for getting a valid token from parameter data
hgs
parents:
diff changeset
    82
	 */
hgs
parents:
diff changeset
    83
	private Pattern parameterNamePattern = Pattern
hgs
parents:
diff changeset
    84
			.compile("[a-zA-Z][a-zA-Z\\d]*"); //$NON-NLS-1$
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
	/**
hgs
parents:
diff changeset
    87
	 * Symbian literal tags
hgs
parents:
diff changeset
    88
	 */
hgs
parents:
diff changeset
    89
	private String[] TRACE_TEXT_TAGS = { "_L8", //$NON-NLS-1$
hgs
parents:
diff changeset
    90
			"_T8", //$NON-NLS-1$
hgs
parents:
diff changeset
    91
			"_L", //$NON-NLS-1$
hgs
parents:
diff changeset
    92
			"_T" //$NON-NLS-1$
hgs
parents:
diff changeset
    93
	};	
hgs
parents:
diff changeset
    94
	
hgs
parents:
diff changeset
    95
	
hgs
parents:
diff changeset
    96
	/**
hgs
parents:
diff changeset
    97
	 * Constructor
hgs
parents:
diff changeset
    98
	 * 
hgs
parents:
diff changeset
    99
	 * @param tag
hgs
parents:
diff changeset
   100
	 *            the tag to be searched from source
hgs
parents:
diff changeset
   101
	 * @param tagSuffixes
hgs
parents:
diff changeset
   102
	 *            the list of allowed suffixes to the tag
hgs
parents:
diff changeset
   103
	 */
hgs
parents:
diff changeset
   104
	protected SourceParserRuleBase(String tag, String[] tagSuffixes) {
hgs
parents:
diff changeset
   105
		this.tag = tag;
hgs
parents:
diff changeset
   106
		// Adds the sub-formats to the parsers
hgs
parents:
diff changeset
   107
		if (tagSuffixes != null) {
hgs
parents:
diff changeset
   108
			int len = tagSuffixes.length;
hgs
parents:
diff changeset
   109
			for (int i = 0; i < len; i++) {
hgs
parents:
diff changeset
   110
				this.tagSuffixes.add(tagSuffixes[i]);
hgs
parents:
diff changeset
   111
			}
hgs
parents:
diff changeset
   112
		}
hgs
parents:
diff changeset
   113
	}
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
	/*
hgs
parents:
diff changeset
   116
	 * (non-Javadoc)
hgs
parents:
diff changeset
   117
	 * 
hgs
parents:
diff changeset
   118
	 * @see com.nokia.tracecompiler.engine.source.SourceParserRule#getSearchTag()
hgs
parents:
diff changeset
   119
	 */
hgs
parents:
diff changeset
   120
	public String getSearchTag() {
hgs
parents:
diff changeset
   121
		return tag;
hgs
parents:
diff changeset
   122
	}
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
	/*
hgs
parents:
diff changeset
   125
	 * (non-Javadoc)
hgs
parents:
diff changeset
   126
	 * 
hgs
parents:
diff changeset
   127
	 * @see com.nokia.tracecompiler.engine.source.SourceParserRule#
hgs
parents:
diff changeset
   128
	 *      isAllowedTagSuffix(java.lang.String)
hgs
parents:
diff changeset
   129
	 */
hgs
parents:
diff changeset
   130
	public boolean isAllowedTagSuffix(String tag) {
hgs
parents:
diff changeset
   131
		boolean retval = false;
hgs
parents:
diff changeset
   132
		if (tag != null) {
hgs
parents:
diff changeset
   133
			if (tag.length() == 0 && tagSuffixes.isEmpty()) {
hgs
parents:
diff changeset
   134
				retval = true;
hgs
parents:
diff changeset
   135
			} else {
hgs
parents:
diff changeset
   136
				for (int i = 0; i < tagSuffixes.size() && !retval; i++) {
hgs
parents:
diff changeset
   137
					String s = tagSuffixes.get(i);
hgs
parents:
diff changeset
   138
					if (s.length() == tag.length()) {
hgs
parents:
diff changeset
   139
						retval = true;
hgs
parents:
diff changeset
   140
						for (int j = 0; j < s.length() && retval; j++) {
hgs
parents:
diff changeset
   141
							char c1 = s.charAt(j);
hgs
parents:
diff changeset
   142
							// '?' can be any character
hgs
parents:
diff changeset
   143
							if (c1 != '?') {
hgs
parents:
diff changeset
   144
								retval = tag.charAt(j) == c1;
hgs
parents:
diff changeset
   145
							}
hgs
parents:
diff changeset
   146
						}
hgs
parents:
diff changeset
   147
					}
hgs
parents:
diff changeset
   148
				}
hgs
parents:
diff changeset
   149
			}
hgs
parents:
diff changeset
   150
		}
hgs
parents:
diff changeset
   151
		return retval;
hgs
parents:
diff changeset
   152
	}
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
	/*
hgs
parents:
diff changeset
   155
	 * (non-Javadoc)
hgs
parents:
diff changeset
   156
	 * 
hgs
parents:
diff changeset
   157
	 * @see com.nokia.tracecompiler.engine.source.SourceParserRule#getName()
hgs
parents:
diff changeset
   158
	 */
hgs
parents:
diff changeset
   159
	public String getName() {
hgs
parents:
diff changeset
   160
		return null;
hgs
parents:
diff changeset
   161
	}
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
	/*
hgs
parents:
diff changeset
   164
	 * (non-Javadoc)
hgs
parents:
diff changeset
   165
	 * 
hgs
parents:
diff changeset
   166
	 * @see com.nokia.tracecompiler.engine.source.SourceParserRule#
hgs
parents:
diff changeset
   167
	 *      parseParameters(java.util.List)
hgs
parents:
diff changeset
   168
	 */
hgs
parents:
diff changeset
   169
	public SourceParserResult parseParameters(String tag, List<String> list)
hgs
parents:
diff changeset
   170
			throws TraceCompilerException {
hgs
parents:
diff changeset
   171
		SourceParserResult result = new SourceParserResult();
hgs
parents:
diff changeset
   172
		result.traceText = trimTraceText(list.get(0));
hgs
parents:
diff changeset
   173
		result.originalName = result.traceText;
hgs
parents:
diff changeset
   174
		result.convertedName = TraceUtils.convertName(
hgs
parents:
diff changeset
   175
				SourceUtils.removePrintfFormatting(result.traceText))
hgs
parents:
diff changeset
   176
				.toUpperCase();
hgs
parents:
diff changeset
   177
		result.parameters = list.subList(1, list.size());
hgs
parents:
diff changeset
   178
		return result;
hgs
parents:
diff changeset
   179
	}
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
	/**
hgs
parents:
diff changeset
   182
	 * Converts a location to trace
hgs
parents:
diff changeset
   183
	 * 
hgs
parents:
diff changeset
   184
	 * @param location
hgs
parents:
diff changeset
   185
	 *            the location to be converted
hgs
parents:
diff changeset
   186
	 * @return the conversion result
hgs
parents:
diff changeset
   187
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   188
	 *             if conversion fails
hgs
parents:
diff changeset
   189
	 */
hgs
parents:
diff changeset
   190
	public TraceConversionResult convertLocation(TraceLocation location)
hgs
parents:
diff changeset
   191
			throws TraceCompilerException {
hgs
parents:
diff changeset
   192
		// All parameter types are supported by default -> false is passed to
hgs
parents:
diff changeset
   193
		// buildParameterTypeList.
hgs
parents:
diff changeset
   194
		List<FormatMapping> types = buildParameterTypeList(location
hgs
parents:
diff changeset
   195
				.getTraceText(), false);
hgs
parents:
diff changeset
   196
		// Parameter count must match the number of format elements in trace
hgs
parents:
diff changeset
   197
		// text -> true is passed to convertLocation by default
hgs
parents:
diff changeset
   198
		return convertLocation(location, true, types);
hgs
parents:
diff changeset
   199
	}
hgs
parents:
diff changeset
   200
	
hgs
parents:
diff changeset
   201
	/**
hgs
parents:
diff changeset
   202
	 * Converts a location to trace
hgs
parents:
diff changeset
   203
	 * 
hgs
parents:
diff changeset
   204
	 * @param location
hgs
parents:
diff changeset
   205
	 *            the location to be converted
hgs
parents:
diff changeset
   206
	 * @param useParametersFromLocation
hgs
parents:
diff changeset
   207
	 *            true if location parameters need to be checked
hgs
parents:
diff changeset
   208
	 * @param types
hgs
parents:
diff changeset
   209
	 *            the parameter types list
hgs
parents:
diff changeset
   210
	 * @return the conversion result
hgs
parents:
diff changeset
   211
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   212
	 *             if conversion fails
hgs
parents:
diff changeset
   213
	 */
hgs
parents:
diff changeset
   214
	protected TraceConversionResult convertLocation(TraceLocation location,
hgs
parents:
diff changeset
   215
			boolean useParametersFromLocation, List<FormatMapping> types)
hgs
parents:
diff changeset
   216
			throws TraceCompilerException {
hgs
parents:
diff changeset
   217
		TraceConversionResult result = new TraceConversionResult();
hgs
parents:
diff changeset
   218
		result.text = location.getTraceText();
hgs
parents:
diff changeset
   219
hgs
parents:
diff changeset
   220
		// If trace text is in multiple lines, remove extra characters
hgs
parents:
diff changeset
   221
		int removableAreaBeging = -1;
hgs
parents:
diff changeset
   222
		for (int i = 0; i < result.text.length(); i++) {
hgs
parents:
diff changeset
   223
			char c = result.text.charAt(i);
hgs
parents:
diff changeset
   224
			if (c == SourceConstants.QUOTE_CHAR
hgs
parents:
diff changeset
   225
					&& (i == 0 || result.text.charAt(i - 1) != SourceConstants.BACKSLASH_CHAR)) {
hgs
parents:
diff changeset
   226
				if (removableAreaBeging != -1) {
hgs
parents:
diff changeset
   227
					String startString = result.text.substring(0,
hgs
parents:
diff changeset
   228
							removableAreaBeging);
hgs
parents:
diff changeset
   229
					String endString = result.text.substring(i + 1, result.text
hgs
parents:
diff changeset
   230
							.length());
hgs
parents:
diff changeset
   231
					result.text = startString + endString;
hgs
parents:
diff changeset
   232
					i = removableAreaBeging;
hgs
parents:
diff changeset
   233
					removableAreaBeging = -1;
hgs
parents:
diff changeset
   234
				} else {
hgs
parents:
diff changeset
   235
					removableAreaBeging = i;
hgs
parents:
diff changeset
   236
				}
hgs
parents:
diff changeset
   237
			}
hgs
parents:
diff changeset
   238
		}
hgs
parents:
diff changeset
   239
hgs
parents:
diff changeset
   240
		result.name = location.getConvertedName();
hgs
parents:
diff changeset
   241
hgs
parents:
diff changeset
   242
		// If location parameters are used, the count must match the number of
hgs
parents:
diff changeset
   243
		// formats parsed from the trace string.
hgs
parents:
diff changeset
   244
		if (!useParametersFromLocation
hgs
parents:
diff changeset
   245
				|| (types.size() == location.getParameterCount() && numberOfParametersInTagMatchSize(
hgs
parents:
diff changeset
   246
						location.getTag(), types.size()))) {
hgs
parents:
diff changeset
   247
			result.parameters = new ArrayList<ParameterConversionResult>(types
hgs
parents:
diff changeset
   248
					.size());
hgs
parents:
diff changeset
   249
			Iterator<String> itr = location.getParameters();
hgs
parents:
diff changeset
   250
			// The FormatMapping objects are converted to
hgs
parents:
diff changeset
   251
			// ParameterConversionResult objects:
hgs
parents:
diff changeset
   252
			// - Name is associated to the parameter
hgs
parents:
diff changeset
   253
			// - Extensions are created
hgs
parents:
diff changeset
   254
			for (int i = 0; i < types.size(); i++) {
hgs
parents:
diff changeset
   255
				FormatMapping mapping = types.get(i);
hgs
parents:
diff changeset
   256
				String name;
hgs
parents:
diff changeset
   257
				if (useParametersFromLocation) {
hgs
parents:
diff changeset
   258
					name = TraceUtils.convertName(trimParameter(itr.next(), i));
hgs
parents:
diff changeset
   259
				} else {
hgs
parents:
diff changeset
   260
					name = DEFAULT_PARAMETER_NAME + (i + 1);
hgs
parents:
diff changeset
   261
				}
hgs
parents:
diff changeset
   262
				ParameterConversionResult param = mapFormatToConversionResult(mapping);
hgs
parents:
diff changeset
   263
				param.name = modifyDuplicateName(result.parameters, name);
hgs
parents:
diff changeset
   264
				result.parameters.add(param);
hgs
parents:
diff changeset
   265
			}
hgs
parents:
diff changeset
   266
		} else {
hgs
parents:
diff changeset
   267
			throw new TraceCompilerException(
hgs
parents:
diff changeset
   268
					TraceCompilerErrorCode.PARAMETER_FORMAT_MISMATCH, null,
hgs
parents:
diff changeset
   269
					location);
hgs
parents:
diff changeset
   270
		}
hgs
parents:
diff changeset
   271
		return result;
hgs
parents:
diff changeset
   272
	}
hgs
parents:
diff changeset
   273
hgs
parents:
diff changeset
   274
	
hgs
parents:
diff changeset
   275
	
hgs
parents:
diff changeset
   276
	/*
hgs
parents:
diff changeset
   277
	 * (non-Javadoc)
hgs
parents:
diff changeset
   278
	 * 
hgs
parents:
diff changeset
   279
	 * @see com.nokia.tracecompiler.engine.source.SourceParserRule#
hgs
parents:
diff changeset
   280
	 *      processNewLocation(com.nokia.tracecompiler.engine.TraceLocation)
hgs
parents:
diff changeset
   281
	 */
hgs
parents:
diff changeset
   282
	public void processNewLocation(TraceLocation location) {
hgs
parents:
diff changeset
   283
	}
hgs
parents:
diff changeset
   284
hgs
parents:
diff changeset
   285
	/*
hgs
parents:
diff changeset
   286
	 * (non-Javadoc)
hgs
parents:
diff changeset
   287
	 * 
hgs
parents:
diff changeset
   288
	 * @see com.nokia.tracecompiler.project.TraceLocationParser#getLocationGroup()
hgs
parents:
diff changeset
   289
	 */
hgs
parents:
diff changeset
   290
	public String getLocationGroup() {
hgs
parents:
diff changeset
   291
		return null;
hgs
parents:
diff changeset
   292
	}
hgs
parents:
diff changeset
   293
hgs
parents:
diff changeset
   294
	/**
hgs
parents:
diff changeset
   295
	 * Maps a format to conversion result
hgs
parents:
diff changeset
   296
	 * 
hgs
parents:
diff changeset
   297
	 * @param mapping
hgs
parents:
diff changeset
   298
	 *            the mapping
hgs
parents:
diff changeset
   299
	 * @return the conversion result
hgs
parents:
diff changeset
   300
	 */
hgs
parents:
diff changeset
   301
	protected ParameterConversionResult mapFormatToConversionResult(
hgs
parents:
diff changeset
   302
			FormatMapping mapping) {
hgs
parents:
diff changeset
   303
		ParameterConversionResult param = new ParameterConversionResult();
hgs
parents:
diff changeset
   304
		param.type = mapping.type;
hgs
parents:
diff changeset
   305
		if (mapping.isArray) {
hgs
parents:
diff changeset
   306
			param.extensions = new ArrayList<TraceModelExtension>();
hgs
parents:
diff changeset
   307
			param.extensions.add(new ArrayParameterRuleImpl());
hgs
parents:
diff changeset
   308
		}
hgs
parents:
diff changeset
   309
		return param;
hgs
parents:
diff changeset
   310
	}
hgs
parents:
diff changeset
   311
hgs
parents:
diff changeset
   312
	/*
hgs
parents:
diff changeset
   313
	 * (non-Javadoc)
hgs
parents:
diff changeset
   314
	 * 
hgs
parents:
diff changeset
   315
	 * @see com.nokia.tracecompiler.engine.source.SourceParserRule#
hgs
parents:
diff changeset
   316
	 *      findLocationComment(com.nokia.tracecompiler.engine.TraceLocation)
hgs
parents:
diff changeset
   317
	 */
hgs
parents:
diff changeset
   318
	public SourceExcludedArea findLocationComment(TraceLocation location) {
hgs
parents:
diff changeset
   319
		SourceParser parser = location.getParser();
hgs
parents:
diff changeset
   320
		SourceExcludedArea excludedArea = null;
hgs
parents:
diff changeset
   321
		if (parser != null) {
hgs
parents:
diff changeset
   322
			try {
hgs
parents:
diff changeset
   323
				int offset = location.getOffset() + location.getLength();
hgs
parents:
diff changeset
   324
				SourceIterator itr = parser.createIterator(offset,
hgs
parents:
diff changeset
   325
						SourceParser.SKIP_WHITE_SPACES);
hgs
parents:
diff changeset
   326
				char c = itr.next();
hgs
parents:
diff changeset
   327
				if (c == ';') {
hgs
parents:
diff changeset
   328
					offset = itr.currentIndex();
hgs
parents:
diff changeset
   329
					c = itr.next();
hgs
parents:
diff changeset
   330
				}
hgs
parents:
diff changeset
   331
				boolean skippedReturn = false;
hgs
parents:
diff changeset
   332
				int commentStart = itr.currentIndex();
hgs
parents:
diff changeset
   333
				for (int i = offset; i < commentStart; i++) {
hgs
parents:
diff changeset
   334
					c = parser.getData(i);
hgs
parents:
diff changeset
   335
					if (c == '\n') {
hgs
parents:
diff changeset
   336
						skippedReturn = true;
hgs
parents:
diff changeset
   337
					}
hgs
parents:
diff changeset
   338
				}
hgs
parents:
diff changeset
   339
				// Comment must be on same line
hgs
parents:
diff changeset
   340
				if (!skippedReturn) {
hgs
parents:
diff changeset
   341
					excludedArea = parser.getExcludedArea(commentStart);
hgs
parents:
diff changeset
   342
				}
hgs
parents:
diff changeset
   343
				if (excludedArea == null) {
hgs
parents:
diff changeset
   344
					// If comment is not on same line, the previous line is
hgs
parents:
diff changeset
   345
					// checked
hgs
parents:
diff changeset
   346
					offset = parser.findStartOfLine(location.getOffset(), true,
hgs
parents:
diff changeset
   347
							true);
hgs
parents:
diff changeset
   348
					excludedArea = parser.getExcludedArea(offset - 1);
hgs
parents:
diff changeset
   349
				}
hgs
parents:
diff changeset
   350
			} catch (SourceParserException e) {
hgs
parents:
diff changeset
   351
			}
hgs
parents:
diff changeset
   352
		}
hgs
parents:
diff changeset
   353
		return excludedArea;
hgs
parents:
diff changeset
   354
	}
hgs
parents:
diff changeset
   355
hgs
parents:
diff changeset
   356
	/*
hgs
parents:
diff changeset
   357
	 * (non-Javadoc)
hgs
parents:
diff changeset
   358
	 * 
hgs
parents:
diff changeset
   359
	 * @see com.nokia.tracecompiler.engine.source.SourceParserRule#getLocationParser()
hgs
parents:
diff changeset
   360
	 */
hgs
parents:
diff changeset
   361
	public TraceLocationParser getLocationParser() {
hgs
parents:
diff changeset
   362
		return this;
hgs
parents:
diff changeset
   363
	}
hgs
parents:
diff changeset
   364
hgs
parents:
diff changeset
   365
	/*
hgs
parents:
diff changeset
   366
	 * (non-Javadoc)
hgs
parents:
diff changeset
   367
	 * 
hgs
parents:
diff changeset
   368
	 * @see com.nokia.tracecompiler.project.TraceLocationParser#
hgs
parents:
diff changeset
   369
	 *      isLocationConverted(com.nokia.tracecompiler.engine.TraceLocation)
hgs
parents:
diff changeset
   370
	 */
hgs
parents:
diff changeset
   371
	public boolean isLocationConverted(TraceLocation location) {
hgs
parents:
diff changeset
   372
		return false;
hgs
parents:
diff changeset
   373
	}
hgs
parents:
diff changeset
   374
hgs
parents:
diff changeset
   375
	/*
hgs
parents:
diff changeset
   376
	 * (non-Javadoc)
hgs
parents:
diff changeset
   377
	 * 
hgs
parents:
diff changeset
   378
	 * @see com.nokia.tracecompiler.project.TraceLocationParser#
hgs
parents:
diff changeset
   379
	 *      checkLocationValidity(com.nokia.tracecompiler.engine.TraceLocation)
hgs
parents:
diff changeset
   380
	 */
hgs
parents:
diff changeset
   381
	public TraceCompilerErrorCode checkLocationValidity(TraceLocation location) {
hgs
parents:
diff changeset
   382
		Trace trace = location.getTrace();
hgs
parents:
diff changeset
   383
		TraceCompilerErrorCode retval = TraceCompilerErrorCode.TRACE_DOES_NOT_EXIST;
hgs
parents:
diff changeset
   384
		if (trace != null) {
hgs
parents:
diff changeset
   385
			retval = TraceCompilerErrorCode.OK;
hgs
parents:
diff changeset
   386
		} else {
hgs
parents:
diff changeset
   387
			// If the API does not match the parser, the needs conversion flag
hgs
parents:
diff changeset
   388
			// is set
hgs
parents:
diff changeset
   389
			TraceProjectAPI api = getOwner().getModel().getExtension(
hgs
parents:
diff changeset
   390
					TraceProjectAPI.class);
hgs
parents:
diff changeset
   391
			if (!api.getName().equals(location.getParserRule().getName())) {
hgs
parents:
diff changeset
   392
				retval = TraceCompilerErrorCode.TRACE_NEEDS_CONVERSION;
hgs
parents:
diff changeset
   393
			}
hgs
parents:
diff changeset
   394
		}
hgs
parents:
diff changeset
   395
		return retval;
hgs
parents:
diff changeset
   396
	}
hgs
parents:
diff changeset
   397
hgs
parents:
diff changeset
   398
	/**
hgs
parents:
diff changeset
   399
	 * Checks if the number of the parameters in the trace tag matches the size
hgs
parents:
diff changeset
   400
	 * of parameter list
hgs
parents:
diff changeset
   401
	 * 
hgs
parents:
diff changeset
   402
	 * @param tag
hgs
parents:
diff changeset
   403
	 *            the trace tag
hgs
parents:
diff changeset
   404
	 * @param size
hgs
parents:
diff changeset
   405
	 *            size of the parameter list
hgs
parents:
diff changeset
   406
	 * @return true is parameter count matches, false otherwise
hgs
parents:
diff changeset
   407
	 */
hgs
parents:
diff changeset
   408
	private boolean numberOfParametersInTagMatchSize(String tag, int size) {
hgs
parents:
diff changeset
   409
		boolean matches = true;
hgs
parents:
diff changeset
   410
		// Parse the last character of the tag to a integer
hgs
parents:
diff changeset
   411
		if (tag != null) {
hgs
parents:
diff changeset
   412
			try {
hgs
parents:
diff changeset
   413
hgs
parents:
diff changeset
   414
				// Check the tag parameter count and compare it to the size of
hgs
parents:
diff changeset
   415
				// the parameter list
hgs
parents:
diff changeset
   416
				String tagParamStr = tag.substring(tag.length() - 1);
hgs
parents:
diff changeset
   417
				int tagParamCount = Integer.parseInt(tagParamStr);
hgs
parents:
diff changeset
   418
hgs
parents:
diff changeset
   419
				if (tagParamCount != size) {
hgs
parents:
diff changeset
   420
					matches = false;
hgs
parents:
diff changeset
   421
				}
hgs
parents:
diff changeset
   422
			} catch (NumberFormatException e) {
hgs
parents:
diff changeset
   423
			}
hgs
parents:
diff changeset
   424
		}
hgs
parents:
diff changeset
   425
		return matches;
hgs
parents:
diff changeset
   426
	}
hgs
parents:
diff changeset
   427
hgs
parents:
diff changeset
   428
	/**
hgs
parents:
diff changeset
   429
	 * Builds the parameter type array which is passed to convertLocation
hgs
parents:
diff changeset
   430
	 * 
hgs
parents:
diff changeset
   431
	 * @param text
hgs
parents:
diff changeset
   432
	 *            the trace text
hgs
parents:
diff changeset
   433
	 * @param simpleParameters
hgs
parents:
diff changeset
   434
	 *            true if only simple types are supported
hgs
parents:
diff changeset
   435
	 * @return the list of types
hgs
parents:
diff changeset
   436
	 * @throws TraceCompilerException
hgs
parents:
diff changeset
   437
	 *             if parser fails
hgs
parents:
diff changeset
   438
	 */
hgs
parents:
diff changeset
   439
	protected List<FormatMapping> buildParameterTypeList(String text,
hgs
parents:
diff changeset
   440
			boolean simpleParameters) throws TraceCompilerException {
hgs
parents:
diff changeset
   441
		Matcher matcher = SourceUtils.traceTextPattern.matcher(text);
hgs
parents:
diff changeset
   442
		ArrayList<FormatMapping> types = new ArrayList<FormatMapping>();
hgs
parents:
diff changeset
   443
		boolean found = true;
hgs
parents:
diff changeset
   444
		do {
hgs
parents:
diff changeset
   445
			found = matcher.find();
hgs
parents:
diff changeset
   446
			if (found) {
hgs
parents:
diff changeset
   447
				String tag = matcher.group();
hgs
parents:
diff changeset
   448
				FormatMapping mapping = SourceUtils
hgs
parents:
diff changeset
   449
						.mapFormatToParameterType(tag);
hgs
parents:
diff changeset
   450
				if (simpleParameters && !mapping.isSimple) {
hgs
parents:
diff changeset
   451
					StringErrorParameters param = new StringErrorParameters();
hgs
parents:
diff changeset
   452
					param.string = tag;
hgs
parents:
diff changeset
   453
					throw new TraceCompilerException(
hgs
parents:
diff changeset
   454
							TraceCompilerErrorCode.PARAMETER_FORMAT_NEEDS_EXT_MACRO,
hgs
parents:
diff changeset
   455
							param, null);
hgs
parents:
diff changeset
   456
				}
hgs
parents:
diff changeset
   457
				types.add(mapping);
hgs
parents:
diff changeset
   458
			}
hgs
parents:
diff changeset
   459
		} while (found);
hgs
parents:
diff changeset
   460
		return types;
hgs
parents:
diff changeset
   461
	}
hgs
parents:
diff changeset
   462
hgs
parents:
diff changeset
   463
	/**
hgs
parents:
diff changeset
   464
	 * Changes a duplicate parameter name to unique
hgs
parents:
diff changeset
   465
	 * 
hgs
parents:
diff changeset
   466
	 * @param parameters
hgs
parents:
diff changeset
   467
	 *            the list of existing parameters
hgs
parents:
diff changeset
   468
	 * @param name
hgs
parents:
diff changeset
   469
	 *            the name
hgs
parents:
diff changeset
   470
	 * @return the modified name
hgs
parents:
diff changeset
   471
	 */
hgs
parents:
diff changeset
   472
	private String modifyDuplicateName(
hgs
parents:
diff changeset
   473
			List<ParameterConversionResult> parameters, String name) {
hgs
parents:
diff changeset
   474
		String retval = name;
hgs
parents:
diff changeset
   475
		for (ParameterConversionResult result : parameters) {
hgs
parents:
diff changeset
   476
			if (result.name.equals(name)) {
hgs
parents:
diff changeset
   477
				retval = name + (parameters.size() + 1);
hgs
parents:
diff changeset
   478
				break;
hgs
parents:
diff changeset
   479
			}
hgs
parents:
diff changeset
   480
		}
hgs
parents:
diff changeset
   481
		return retval;
hgs
parents:
diff changeset
   482
	}
hgs
parents:
diff changeset
   483
hgs
parents:
diff changeset
   484
	/**
hgs
parents:
diff changeset
   485
	 * Trims extra stuff away from trace text
hgs
parents:
diff changeset
   486
	 * 
hgs
parents:
diff changeset
   487
	 * @param data
hgs
parents:
diff changeset
   488
	 *            the data to be trimmed
hgs
parents:
diff changeset
   489
	 * @return trimmed text
hgs
parents:
diff changeset
   490
	 */
hgs
parents:
diff changeset
   491
	protected String trimTraceText(String data) {
hgs
parents:
diff changeset
   492
		// Removes literal macros
hgs
parents:
diff changeset
   493
		for (String element : TRACE_TEXT_TAGS) {
hgs
parents:
diff changeset
   494
			if (data.startsWith(element)) {
hgs
parents:
diff changeset
   495
				data = data.substring(element.length());
hgs
parents:
diff changeset
   496
			}
hgs
parents:
diff changeset
   497
		}
hgs
parents:
diff changeset
   498
		data = data.trim();
hgs
parents:
diff changeset
   499
		// Removes the opening bracket and quotes
hgs
parents:
diff changeset
   500
		data = removeBrackets(data);
hgs
parents:
diff changeset
   501
		if (data.startsWith("\"") //$NON-NLS-1$
hgs
parents:
diff changeset
   502
				&& data.length() >= 2) { // CodForChk_Dis_Magic
hgs
parents:
diff changeset
   503
			data = data.substring(1, data.length() - 1);
hgs
parents:
diff changeset
   504
		}
hgs
parents:
diff changeset
   505
		return data;
hgs
parents:
diff changeset
   506
	}
hgs
parents:
diff changeset
   507
hgs
parents:
diff changeset
   508
	/**
hgs
parents:
diff changeset
   509
	 * Removes the brackets around the given data
hgs
parents:
diff changeset
   510
	 * 
hgs
parents:
diff changeset
   511
	 * @param data
hgs
parents:
diff changeset
   512
	 *            the data
hgs
parents:
diff changeset
   513
	 * @return the modified data
hgs
parents:
diff changeset
   514
	 */
hgs
parents:
diff changeset
   515
	protected String removeBrackets(String data) {
hgs
parents:
diff changeset
   516
		boolean canRemove = true;
hgs
parents:
diff changeset
   517
		while (data.startsWith("(") //$NON-NLS-1$
hgs
parents:
diff changeset
   518
				&& data.endsWith(")") //$NON-NLS-1$
hgs
parents:
diff changeset
   519
				&& canRemove) {
hgs
parents:
diff changeset
   520
			// If closing bracket is found first, the first bracket cannot be
hgs
parents:
diff changeset
   521
			// removed.
hgs
parents:
diff changeset
   522
			// TODO: Does not work with for example ((Cast)abc).Func()
hgs
parents:
diff changeset
   523
			// -> (Cast)abc).Func(
hgs
parents:
diff changeset
   524
			for (int i = 1; i < data.length() - 1 && canRemove; i++) {
hgs
parents:
diff changeset
   525
				if (data.charAt(i) == '(') {
hgs
parents:
diff changeset
   526
					i = data.length();
hgs
parents:
diff changeset
   527
				} else if (data.charAt(i) == ')') {
hgs
parents:
diff changeset
   528
					canRemove = false;
hgs
parents:
diff changeset
   529
				}
hgs
parents:
diff changeset
   530
			}
hgs
parents:
diff changeset
   531
			if (canRemove) {
hgs
parents:
diff changeset
   532
				data = data.substring(1, data.length() - 1).trim();
hgs
parents:
diff changeset
   533
			}
hgs
parents:
diff changeset
   534
		}
hgs
parents:
diff changeset
   535
		return data;
hgs
parents:
diff changeset
   536
	}
hgs
parents:
diff changeset
   537
hgs
parents:
diff changeset
   538
	/**
hgs
parents:
diff changeset
   539
	 * Trims extra stuff away from a parameter to create a parameter label
hgs
parents:
diff changeset
   540
	 * 
hgs
parents:
diff changeset
   541
	 * @param data
hgs
parents:
diff changeset
   542
	 *            the parameter data
hgs
parents:
diff changeset
   543
	 * @param index
hgs
parents:
diff changeset
   544
	 *            the parameter index. The index will be used as label if the
hgs
parents:
diff changeset
   545
	 *            label cannot be parsed
hgs
parents:
diff changeset
   546
	 * @return the parameter label
hgs
parents:
diff changeset
   547
	 */
hgs
parents:
diff changeset
   548
	protected String trimParameter(String data, int index) {
hgs
parents:
diff changeset
   549
		// Removes possible literal macros
hgs
parents:
diff changeset
   550
		data = trimTraceText(data);
hgs
parents:
diff changeset
   551
		// Removes casting operations.
hgs
parents:
diff changeset
   552
		Matcher matcher = cppCastTrimPattern.matcher(data);
hgs
parents:
diff changeset
   553
		data = removeBrackets(matcher.replaceFirst("")); //$NON-NLS-1$
hgs
parents:
diff changeset
   554
		matcher = cCastTrimPattern.matcher(data);
hgs
parents:
diff changeset
   555
		data = matcher.replaceFirst(""); //$NON-NLS-1$
hgs
parents:
diff changeset
   556
		// Finds the next valid token from the data
hgs
parents:
diff changeset
   557
		matcher = parameterNamePattern.matcher(data);
hgs
parents:
diff changeset
   558
		if (matcher.find()) {
hgs
parents:
diff changeset
   559
			data = matcher.group();
hgs
parents:
diff changeset
   560
		} else {
hgs
parents:
diff changeset
   561
			data = DEFAULT_PARAMETER_NAME + (index + 1);
hgs
parents:
diff changeset
   562
		}
hgs
parents:
diff changeset
   563
		return data;
hgs
parents:
diff changeset
   564
	}	
hgs
parents:
diff changeset
   565
}