У меня есть функция javascript:
string.prototype.startsWith = function(str) {
return (this.indexOf(str) === 0);
}
, и когда я запускаю ее на чем-то, чей typeof возвращает object
, это работает.Когда я запускаю его на том, чей typeof возвращает string
, я получаю:
javax.script.ScriptException: sun.org.mozilla.javascript.internal.EcmaError: TypeError: Cannot find function startsWith. (<Unknown source>#29) in <Unknown source> at line number 29
Кто-нибудь знает, что происходит?Я даже не понимаю, почему тип экземпляра первой вещи, которую я использую, это объект.Это результат вызова readLine, разве это не строка?
<target name="analyze">
<script language="javascript">
<![CDATA[
importClass(java.io.File);
importClass(java.io.FileReader)
importClass(java.io.BufferedReader)
//setup the source directory
dir = project.getProperty("PROJECT_HOME");
fs = project.createDataType("fileset");
fs.setDir(new File(dir));
//only analyze java files
fs.setIncludes("**/*.java");
echo = project.createTask("echo");
//iterate over files found
srcFiles = fs.getDirectoryScanner(project).getIncludedFiles();
for (i = 0; i < srcFiles.length; i++) {
var filename = srcFiles[i];
inFile = new BufferedReader(new FileReader(new File(dir + "/" + filename)));
while ((line = inFile.readLine()) != null) {
if(line.startsWith("package")) {
packageStr = line.substr(8);
while((line = inFile.readLine()) != null) {
if(line.startsWith("import") && line.endsWith("Foo;")) {
//strip out the leading import in 'import x.y.z'
var importStr = line.substr(7);
importStr = importStr.substr(0, importStr.lastIndexOf('.'));
if(!importStr.startsWith(packageStr)) { <---- FAILS!
}
}
}
}
}
inFile.close();
}
String.prototype.startsWith = function(str) {
return (this.indexOf(str) === 0);
}
String.prototype.endsWith = function(str) {
var lastIndex = this.lastIndexOf(str);
return (lastIndex != -1) && (lastIndex + str.length == this.length);
}
]]>
</script>
</target>