blob: 618933f4120cfe409a8f837974eecdf1138764d6 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.royale.compiler.problems;
import org.apache.royale.compiler.clients.problems.ProblemFormatter;
import org.apache.royale.compiler.common.ISourceLocation;
import org.apache.royale.compiler.definitions.IDefinition;
import org.apache.royale.compiler.parsing.IASToken;
import org.apache.royale.compiler.problems.annotations.DefaultSeverity;
import org.apache.royale.compiler.problems.annotations.ProblemClassification;
import org.apache.royale.utils.FilenameNormalization;
/**
* CompilerProblem is the base class for all error and warning classes in the compiler,
* which are collectively called "problems".
*
* Each problem has
* 1) source location information (file/start/end/line/column);
* 2) a description with named placeholders which get filled in
* from the public fields of the problem class;
* 3) the ability to compare itself to other problems,
* to produce a nicely sorted list of problems;
* 4) the ability to toString() itself for command-line output such as
*
* C:\Faramir\compiler\trunk\tests\resources\milestones\m1\M1.as:4
* Syntax error: '+' is not allowed here
* import flash.display.+Sprite;
* ^
* where a caret marks the offending spot in the offending line.
*/
@ProblemClassification(CompilerProblemClassification.DEFAULT)
@DefaultSeverity(CompilerProblemSeverity.ERROR)
public abstract class CompilerProblem implements ICompilerProblem
{
/**
* Constructor.
*
* @param sourcePath The path of the file in which the problem occurred.
* @param start The offset within the source buffer at which the problem starts.
* @param end The offset within the source buffer at which the problem ends.
* @param line The line number within the source buffer at which the problem starts.
* @param column The column number within the source buffer at which the problem starts.
* @param endLine The line number within the source buffer at which the problem ends.
* @param endColumn The column number within the source buffer at which the problem ends.
* @param normalizeFilePath true if the path can be normalized. This is needed
* by configuration problems that have the "command line" as there source.
*/
public CompilerProblem(String sourcePath, int start, int end,
int line, int column, int endLine, int endColumn,
boolean normalizeFilePath)
{
if (sourcePath != null && normalizeFilePath)
sourcePath = FilenameNormalization.normalize(sourcePath);
this.sourcePath = sourcePath;
this.start = start;
this.end = end;
this.line = line;
this.column = column;
this.endLine = endLine;
this.endColumn = endColumn;
}
/**
* Constructor.
*
* @param sourcePath The path of the file in which the problem occurred.
* @param start The offset within the source buffer at which the problem starts.
* @param end The offset within the source buffer at which the problem ends.
* @param line The line number within the source buffer at which the problem starts.
* @param column The column number within the source buffer at which the problem starts.
* @param normalizeFilePath true if the path can be normalized. This is needed
* by configuration problems that have the "command line" as there source.
*/
public CompilerProblem(String sourcePath, int start, int end, int line, int column,
boolean normalizeFilePath)
{
this(sourcePath, start, end, line, column, line, column, normalizeFilePath);
}
/**
* Constructor.
*
* @param sourcePath The normalized path of the file in which the problem occurred.
* @param start The offset within the source buffer at which the problem starts.
* @param end The offset within the source buffer at which the problem ends.
* @param line The line number within the source buffer at which the problem starts.
* @param column The column number within the source buffer at which the problem starts.
*/
public CompilerProblem(String sourcePath, int start, int end, int line, int column)
{
this(sourcePath, start, end, line, column, true);
}
/**
* Constructor.
*
* @param sourcePath The normalized path of the file in which the problem occurred.
* @param start The offset within the source buffer at which the problem starts.
* @param end The offset within the source buffer at which the problem ends.
* @param line The line number within the source buffer at which the problem starts.
* @param column The column number within the source buffer at which the problem starts.
* @param endLine The line number within the source buffer at which the problem ends.
* @param endColumn The column number within the source buffer at which the problem ends.
*/
public CompilerProblem(String sourcePath, int start, int end, int line, int column, int endLine, int endColumn)
{
this(sourcePath, start, end, line, column, endLine, endColumn, true);
}
/**
* Constructor for a problem whose only source-location information
* is a source path.
*
* @param sourcePath The normalized path of the file
* in which the problem occurred.
*/
public CompilerProblem(String sourcePath)
{
this(sourcePath, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, true);
}
/**
* Constructor for a problem with no source-location information.
*/
public CompilerProblem()
{
this(null, UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN, true);
}
/**
* Constructor for a problem associated with an object
* implementing {@link ISourceLocation}.
*
* @param site The {@link ISourceLocation} where the problem occurred.
*/
public CompilerProblem(ISourceLocation site)
{
this(site.getSourcePath(),
site.getStart(), site.getEnd(),
site.getLine(), site.getColumn(),
site.getEndLine(), site.getEndColumn());
}
/**
* Constructor for a problem associated with an {@link IDefinition}.
*
* @param site The {@link IDefinition} where the problem occurred.
*/
public CompilerProblem(IDefinition site)
{
this(site.getSourcePath(),
site.getNameStart(), site.getNameEnd(),
site.getNameLine(), site.getNameColumn(),
site.getNameLine(),
site.getNameColumn() + site.getNameEnd() - site.getNameStart());
}
/**
* Constructor for a problem associated with an {@link IASToken}.
*
* @param site The {@link IASToken} where the problem occurred.
*/
public CompilerProblem(IASToken site)
{
this(site.getSourcePath(),
site.getLocalStart(), site.getLocalEnd(),
site.getLine(), site.getColumn(),
site.getEndLine(), site.getEndColumn());
}
private final String sourcePath;
private final int start;
private final int end;
private final int line;
private final int column;
private final int endLine;
private final int endColumn;
@Override
public String getID()
{
// Return the fully-qualified classname of the CompilerProblem subclass
// as a String to identify the type of problem that occurred.
return getClass().getName();
}
@Override
public String getSourcePath()
{
return sourcePath;
}
@Override
public int getStart()
{
return start;
}
@Override
public int getEnd()
{
return end;
}
@Override
public int getLine()
{
return line;
}
@Override
public int getColumn()
{
return column;
}
@Override
public int getEndLine()
{
return endLine;
}
@Override
public int getEndColumn()
{
return endColumn;
}
@Override
public int getAbsoluteStart()
{
return start;
}
@Override
public int getAbsoluteEnd()
{
return end;
}
/**
* Returns a String for displaying this compiler problem in a console window.
*
* This is for debugging purposes, therefore no non-test code should call this.
*
* There are typically four lines output for each problem:
* location (file and line number)
* description
*
* For example:
*
* C:\Faramir\compiler\trunk\tests\resources\milestones\m1\M1.as:4
* Syntax error: '+' not allowed here.
*/
@Override
public String toString()
{
return ProblemFormatter.DEFAULT_FORMATTER.format(this);
}
}