/**
*
*/
package bixie.checker.reportprinter;
import boogie.ProgramFactory;
import boogie.ast.Attribute;
import boogie.ast.NamedAttribute;
import boogie.ast.expression.literal.IntegerLiteral;
import boogie.ast.expression.literal.StringLiteral;
/**
* @author schaef
*
*/
public class SourceLocation {
public String FileName = "";
public int StartLine = -1;
public int EndLine = -1;
public int StartCol = -1;
public int EndCol = -1;
public String comment = "";
public boolean isCloned = false;
public boolean isNoVerify = false;
public boolean inInfeasibleBlock = false;
public SourceLocation() {
//do nothing
}
public SourceLocation(SourceLocation other) {
this.FileName=other.FileName;
this.StartLine=other.StartLine;
this.StartCol = other.StartCol;
this.EndLine=other.EndLine;
this.EndCol = other.EndCol;
this.comment = other.comment;
this.isCloned = other.isCloned;
this.isNoVerify = other.isNoVerify;
this.inInfeasibleBlock = other.inInfeasibleBlock;
}
@Override
public boolean equals(Object other) {
if (other instanceof SourceLocation) {
SourceLocation o = (SourceLocation) other;
return o.FileName.equals(FileName)
&& o.StartLine == this.StartLine
&& o.EndLine == this.EndLine
&& o.StartCol == this.StartCol
&& o.EndCol == this.EndCol;
}
return false;
}
@Override
public int hashCode() {
return this.FileName.hashCode() * StartLine * EndLine * StartCol
* EndCol;
}
public static SourceLocation readSourceLocationFromAttributes(
Attribute[] attributes) {
SourceLocation jcl = null;
String comment = null;
boolean noverify = false;
boolean cloned = false;
for (Attribute attr : attributes) {
if (attr instanceof NamedAttribute) {
NamedAttribute na = (NamedAttribute) attr;
if (na.getName().equals(ProgramFactory.LocationTag)
&& na.getValues().length >= 3) {
try {
jcl = new SourceLocation();
jcl.FileName = ((StringLiteral) na.getValues()[0])
.getValue();
if (na.getValues()[1] instanceof IntegerLiteral) { // else
// its
// -1
jcl.StartLine = Integer
.parseInt(((IntegerLiteral) na.getValues()[1])
.getValue());
}
if (na.getValues()[2] instanceof IntegerLiteral) { // else
// its
// -1
jcl.StartCol = Integer
.parseInt(((IntegerLiteral) na.getValues()[2])
.getValue());
}
if (na.getValues().length >= 5) {
if (na.getValues()[3] instanceof IntegerLiteral) { // else
// its
// -1
jcl.EndLine = Integer
.parseInt(((IntegerLiteral) na
.getValues()[3]).getValue());
}
if (na.getValues()[4] instanceof IntegerLiteral) { // else
// its
// -1
jcl.EndCol = Integer
.parseInt(((IntegerLiteral) na
.getValues()[4]).getValue());
}
}
} catch (NullPointerException e) {
e.printStackTrace();
jcl = null;
}
} else if (na.getName().equals(ProgramFactory.Comment)) {
if (na.getValues().length > 0
&& na.getValues()[0] instanceof StringLiteral) {
comment = ((StringLiteral) na.getValues()[0])
.getValue();
} else {
comment = null;
}
} else if (na.getName().equals(ProgramFactory.Cloned)) {
cloned = true;
} else if (na.getName().equals(ProgramFactory.NoVerifyTag)) {
noverify = true;
}
}
}
if (jcl != null ) {
if (comment!=null) jcl.comment = comment;
jcl.isCloned = cloned;
jcl.isNoVerify = noverify;
}
return jcl;
}
}