Warning : session_start(): open(/var/lib/php/sessions/sess_nt445rcq13drc5812li8k82ut6, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning : session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
import java.util.*;
import java.util.zip.*;
import java.util.List;
import java.util.regex.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
import java.util.concurrent.locks.*;
import java.util.function.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.table.*;
import java.io.*;
import java.net.*;
import java.lang.reflect.*;
import java.lang.ref.*;
import java.lang.management.*;
import java.security.*;
import java.security.spec.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.awt.geom.*;
import javax.imageio.*;
import java.math.*;
import java.time.Duration;
import java.lang.invoke.VarHandle;
import java.lang.invoke.MethodHandles;
import static x30_pkg.x30_util.DynamicObject;
import java.nio.file.*;
import static java.nio.file.StandardWatchEventKinds.*;
import org.fife.ui.autocomplete.*;
import org.fife.rsta.ui.CollapsibleSectionPanel;
import org.fife.rsta.ui.GoToDialog;
import org.fife.rsta.ui.SizeGripIcon;
import org.fife.rsta.ui.search.FindDialog;
import org.fife.rsta.ui.search.ReplaceDialog;
import org.fife.rsta.ui.search.ReplaceToolBar;
import org.fife.rsta.ui.search.SearchEvent;
import org.fife.rsta.ui.search.SearchListener;
import org.fife.rsta.ui.search.FindToolBar;
import org.fife.ui.rsyntaxtextarea.ErrorStrip;
import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
import org.fife.ui.rsyntaxtextarea.SyntaxConstants;
import org.fife.ui.rtextarea.RTextScrollPane;
import org.fife.ui.rtextarea.SearchContext;
import org.fife.ui.rtextarea.SearchEngine;
import org.fife.ui.rtextarea.SearchResult;
import org.fife.ui.rsyntaxtextarea.RSyntaxDocument;
import org.fife.ui.rsyntaxtextarea.SyntaxScheme;
import org.apache.bcel.classfile.ClassParser;
import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.Const;
import org.apache.bcel.generic.*;
import java.lang.reflect.Type;
import java.nio.file.Path;
import javax.swing.border.TitledBorder;
import java.util.jar.*;
import java.awt.datatransfer.*;
import java.awt.dnd.*;
import java.text.*;
import javax.swing.event.AncestorListener;
import javax.swing.event.AncestorEvent;
import javax.swing.Timer;
import org.fife.ui.rsyntaxtextarea.*;
import java.awt.datatransfer.StringSelection;
import javax.swing.border.*;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.DataFlavor;
import java.awt.geom.*;
import javax.swing.undo.UndoManager;
import java.text.NumberFormat;
import javax.imageio.metadata.*;
import javax.imageio.stream.*;
import java.text.SimpleDateFormat;
import java.nio.charset.Charset;
import java.util.TimeZone;
import java.awt.datatransfer.UnsupportedFlavorException;
import javax.swing.Icon;
public class main {
public interface G22MasterStuff {
public RunnablesReferenceQueue runnablesReferenceQueue();
public EphemeralObjectIDs ephemeralObjectIDs();
public File databasesMotherDir();
default public IG22LoadedDB openDatabase(File dir) {
return openDatabase(dir, false);
}
public IG22LoadedDB openDatabase(File dir, boolean hidden);
default public IG22LoadedDB openDB(String dbName) {
return openDB(dbName, false);
}
public IG22LoadedDB openDB(String dbName, boolean hidden);
public void closeDatabase(File dir);
public void switchToDatabase(File dir);
public Collection openConceptDirs();
public IG22LoadedDB getLoadedDB(Concepts concepts);
public IG22LoadedDB getLoadedDBForConceptDir(File dir);
default public Collection extends IG22LoadedDB> openProjects() {
return getLoadedDBs();
}
public Collection extends IG22LoadedDB> getLoadedDBs();
public G22MasterStuff onLoadedDBsChange(Runnable r);
public G22MasterStuff removeLoadedDBsChangeListener(Runnable r);
public IF1 makeClassFinder();
public IF0WithChangeListeners lvGazelleUserCount();
public ILASClassLoader lasClassLoader();
public boolean devMode();
public void newClassesDefined();
public G22MasterStuff onNewClassesDefined(Runnable r);
public G22MasterStuff removeNewClassesDefinedListener(Runnable r);
default public boolean isConceptDirLoaded(File dir) {
return getLoadedDBForConceptDir(dir) != null;
}
public void restart();
}
static public int concepts_internStringsLongerThan = 10;
static public ThreadLocal concepts_unlisted = new ThreadLocal();
static public boolean concepts_unlistedByDefault = true;
public interface IConceptIndex {
public void update(Concept c);
public void remove(Concept c);
}
public interface IFieldIndex {
public Collection getAll(Val val);
public List allValues();
public MultiSet allValues_multiSet();
public IterableIterator objectIterator();
}
static public class ConceptsChange {
}
static public class ConceptCreate extends ConceptsChange implements IFieldsToList {
public Concept c;
public ConceptCreate() {
}
public ConceptCreate(Concept c) {
this.c = c;
}
public String toString() {
return shortClassName_dropNumberPrefix(this) + "(" + c + ")";
}
public boolean equals(Object o) {
if (!(o instanceof ConceptCreate))
return false;
ConceptCreate __3 = (ConceptCreate) o;
return eq(c, __3.c);
}
public int hashCode() {
int h = -1751266972;
h = boostHashCombine(h, _hashCode(c));
return h;
}
public Object[] _fieldsToList() {
return new Object[] { c };
}
}
static public class ConceptChange extends ConceptsChange implements IFieldsToList {
public Concept c;
public ConceptChange() {
}
public ConceptChange(Concept c) {
this.c = c;
}
public String toString() {
return shortClassName_dropNumberPrefix(this) + "(" + c + ")";
}
public boolean equals(Object o) {
if (!(o instanceof ConceptChange))
return false;
ConceptChange __4 = (ConceptChange) o;
return eq(c, __4.c);
}
public int hashCode() {
int h = -1760609256;
h = boostHashCombine(h, _hashCode(c));
return h;
}
public Object[] _fieldsToList() {
return new Object[] { c };
}
}
static public class ConceptDelete extends ConceptsChange implements IFieldsToList {
static final public String _fieldOrder = "id c";
public long id;
public Concept c;
public ConceptDelete() {
}
public ConceptDelete(long id, Concept c) {
this.c = c;
this.id = id;
}
public String toString() {
return shortClassName_dropNumberPrefix(this) + "(" + id + ", " + c + ")";
}
public boolean equals(Object o) {
if (!(o instanceof ConceptDelete))
return false;
ConceptDelete __5 = (ConceptDelete) o;
return id == __5.id && eq(c, __5.c);
}
public int hashCode() {
int h = -1734431213;
h = boostHashCombine(h, _hashCode(id));
h = boostHashCombine(h, _hashCode(c));
return h;
}
public Object[] _fieldsToList() {
return new Object[] { id, c };
}
}
static public class FullChange extends ConceptsChange implements IFieldsToList {
public FullChange() {
}
public String toString() {
return shortClassName_dropNumberPrefix(this);
}
public boolean equals(Object o) {
return o instanceof FullChange;
}
public int hashCode() {
int h = 733452095;
return h;
}
public Object[] _fieldsToList() {
return null;
}
}
static public class Concepts implements AutoCloseable {
public SortedMap concepts = synchroTreeMap();
final public long getIdCounter() {
return idCounter();
}
public long idCounter() {
return idCounter;
}
public long idCounter;
transient public HashMap perClassData;
transient public Map miscMap;
transient public String programID;
transient public File conceptsFile;
transient public Concepts parent;
transient volatile public long changes, changesWritten, lastChange;
transient volatile public java.util.Timer autoSaver;
transient volatile public boolean dontSave = false;
transient volatile public boolean savingConcepts, noXFullGrab;
transient public boolean vmBusSend = true;
transient public boolean initialSave = false;
transient public int autoSaveInterval = -1000;
transient public boolean useGZIP = true, quietSave;
transient public ReentrantLock lock = new ReentrantLock(true);
transient public ReentrantLock saverLock = new ReentrantLock(true);
transient public long lastSaveTook = -1, lastSaveWas, loadTook, uncompressedSize;
transient public float maxAutoSavePercentage = 10;
transient public List conceptIndices;
transient public Map, Map> fieldIndices;
transient public Map, Map> ciFieldIndices;
transient public List preSave;
transient public Object classFinder = _defaultClassFinder();
transient public List onAllChanged = synchroList();
transient public Set onChange = new HashSet();
transient public Object saveWrapper;
final public Concepts setModifyOnCreate(boolean modifyOnCreate) {
return modifyOnCreate(modifyOnCreate);
}
public Concepts modifyOnCreate(boolean modifyOnCreate) {
this.modifyOnCreate = modifyOnCreate;
return this;
}
final public boolean getModifyOnCreate() {
return modifyOnCreate();
}
public boolean modifyOnCreate() {
return modifyOnCreate;
}
transient public boolean modifyOnCreate = false;
transient public boolean modifyOnBackRef = false;
transient public boolean useFileLock = true;
final public Concepts setGrabThroughSocket(boolean grabThroughSocket) {
return grabThroughSocket(grabThroughSocket);
}
public Concepts grabThroughSocket(boolean grabThroughSocket) {
this.grabThroughSocket = grabThroughSocket;
return this;
}
final public boolean getGrabThroughSocket() {
return grabThroughSocket();
}
public boolean grabThroughSocket() {
return grabThroughSocket;
}
transient public boolean grabThroughSocket = true;
transient public FileBasedLock fileLock;
transient public boolean storeBaseClassesInStructure = false;
transient public boolean useBackRefsForSearches = false;
transient public boolean defunct = false;
transient public int newBackupEveryXMinutes = 60;
final public Concepts setCloseConceptsOnExit(boolean closeConceptsOnExit) {
return closeConceptsOnExit(closeConceptsOnExit);
}
public Concepts closeConceptsOnExit(boolean closeConceptsOnExit) {
this.closeConceptsOnExit = closeConceptsOnExit;
return this;
}
final public boolean getCloseConceptsOnExit() {
return closeConceptsOnExit();
}
public boolean closeConceptsOnExit() {
return closeConceptsOnExit;
}
transient public boolean closeConceptsOnExit = false;
public Concepts() {
}
public Concepts(String programID) {
this.programID = programID;
}
public Concepts(File conceptsFile) {
this.conceptsFile = conceptsFile;
}
synchronized public long internalID() {
do {
++idCounter;
} while (hasConcept(idCounter));
return idCounter;
}
synchronized public HashMap perClassData() {
if (perClassData == null)
perClassData = new HashMap();
return perClassData;
}
public void initProgramID() {
if (programID == null)
programID = getDBProgramID();
}
public Concepts load(String structure) {
return load(structure, false);
}
public Concepts load(String structure, boolean allDynamic) {
clearConcepts();
Map map = unstructureMap(structure, allDynamic, classFinder);
concepts.putAll(map);
assignConceptsToUs();
calcIdCounter();
return this;
}
public Concepts load() {
initProgramID();
Object dbGrabber = miscMapGet("dbGrabber");
if (dbGrabber != null && !isFalse(callF(dbGrabber)))
return this;
try {
if (grabThroughSocket && tryToGrab())
return this;
} catch (Throwable e) {
if (!exceptionMessageContains(e, "no xfullgrab"))
printShortException(e);
print("xfullgrab failed - loading DB of " + programID + " from disk");
}
return loadFromDisk();
}
public Concepts loadFromDisk() {
if (nempty(concepts))
clearConcepts();
long time = now();
Map _concepts = (Map) (unstructureGZFile(conceptsFile(), toIF1(classFinder)));
putAll(concepts, _concepts);
assignConceptsToUs();
loadTook = now() - time;
done("Loaded " + n2(l(concepts), "concept"), time);
calcIdCounter();
return this;
}
public Concepts loadConcepts() {
return load();
}
public boolean tryToGrab() {
if (sameSnippetID(programID, getDBProgramID()))
return false;
RemoteDB db = connectToDBOpt(programID);
try {
if (db != null) {
loadGrab(db.fullgrab());
return true;
}
return false;
} finally {
_close(db);
}
}
public Concepts loadGrab(String grab) {
clearConcepts();
DynamicObject_loading.set(true);
try {
Map map = (Map) unstructure(grab, false, classFinder);
concepts.putAll(map);
assignConceptsToUs();
for (long l : map.keySet()) idCounter = max(idCounter, l);
} finally {
DynamicObject_loading.set(null);
}
return this;
}
public void assignConceptsToUs() {
for (Pair p : mapToPairs((Map) (Map) concepts)) if (!(p.b instanceof Concept)) {
print("DROPPING non-existant concept " + p.a + ": " + dynShortName(p.b));
concepts.remove(p.a);
}
for (Concept c : values(concepts)) c._concepts = this;
for (Concept c : values(concepts)) c._doneLoading2();
}
public String progID() {
return programID == null ? getDBProgramID() : programID;
}
public Concept getConcept(String id) {
return empty(id) ? null : getConcept(parseLong(id));
}
public Concept getConcept(long id) {
return (Concept) concepts.get((long) id);
}
public Concept getConcept(RC ref) {
return ref == null ? null : getConcept(ref.longID());
}
public boolean hasConcept(long id) {
return concepts.containsKey((long) id);
}
public void deleteConcept(long id) {
Concept c = getConcept(id);
if (c == null)
print("Concept " + id + " not found");
else
c.delete();
}
public void calcIdCounter() {
Long lastID = lastKey(concepts);
idCounter = lastID == null ? 1 : lastID + 1;
}
public File conceptsDir() {
return dirOfFile(conceptsFile());
}
public Concepts conceptsFile(File conceptsFile) {
this.conceptsFile = conceptsFile;
return this;
}
public File conceptsFile() {
if (conceptsFile != null)
return conceptsFile;
return getProgramFile(programID, useGZIP ? "concepts.structure.gz" : "concepts.structure");
}
public File lockFile() {
return newFile(conceptsDir(), "concepts.lock");
}
public FileBasedLock fileLock() {
if (fileLock == null)
fileLock = new FileBasedLock(lockFile());
return fileLock;
}
public void saveConceptsIfDirty() {
saveConcepts();
}
public void save() {
saveConcepts();
}
public void saveConcepts() {
vmBus_send("saveConceptsCalled", Concepts.this);
if (dontSave)
return;
initProgramID();
saverLock.lock();
savingConcepts = true;
long start = now(), time;
try {
String s = null;
long _changes = changes;
if (_changes == changesWritten)
return;
File f = conceptsFile();
lock.lock();
long fullTime = now();
try {
if (useGZIP) {
vmBus_send("callingSaveWrapper", Concepts.this, saveWrapper);
callRunnableWithWrapper(saveWrapper, new Runnable() {
public void run() {
try {
vmBus_send("callingPreSave", Concepts.this, preSave);
callFAll(preSave);
vmBus_send("writingFile", Concepts.this, f);
uncompressedSize = saveGZStructureToFile(f, cloneMap(concepts), makeStructureData());
vmBus_send("gzFileSaved", Concepts.this, f, uncompressedSize);
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "vmBus_send callingPreSave(Concepts.this, preSave);\r\n callFAll(preS...";
}
});
newFile(conceptsDir(), "concepts.structure").delete();
} else
s = fullStructure();
} finally {
lock.unlock();
}
changesWritten = _changes;
if (!useGZIP) {
time = now() - start;
if (!quietSave)
print("Saving " + toM(l(s)) + "M chars (" + time + " ms)");
start = now();
saveTextFile(f, javaTokWordWrap(s));
newFile(conceptsDir(), "concepts.structure.gz").delete();
}
File conceptsFile = conceptsFile();
File backupFile = newFile(conceptsDir(), "backups/" + fileName(conceptsFile) + ".backup" + ymd() + "-" + formatInt(hours(), 2) + (newBackupEveryXMinutes >= 60 ? "" : formatInt(roundDownTo_rev(minutes(), newBackupEveryXMinutes), 2)));
copyFile(f, backupFile);
time = now() - start;
if (!quietSave)
print("Saved " + toK(f.length()) + " K, " + n(concepts, "concepts") + " (" + time + " ms)");
lastSaveWas = fullTime;
lastSaveTook = now() - fullTime;
} finally {
savingConcepts = false;
saverLock.unlock();
}
}
public void _autoSaveConcepts() {
if (autoSaveInterval < 0 && maxAutoSavePercentage != 0) {
long pivotTime = Math.round(lastSaveWas + lastSaveTook * 100.0 / maxAutoSavePercentage);
if (now() < pivotTime) {
return;
}
}
try {
saveConcepts();
} catch (Throwable e) {
print("Concept save failed, will try again");
printStackTrace(e);
}
}
public String fullStructure() {
return structure(cloneMap(concepts), makeStructureData());
}
transient public IF0 makeStructureData;
public structure_Data makeStructureData() {
return makeStructureData != null ? makeStructureData.get() : makeStructureData_base();
}
final public structure_Data makeStructureData_fallback(IF0 _f) {
return _f != null ? _f.get() : makeStructureData_base();
}
public structure_Data makeStructureData_base() {
return finishStructureData(new structure_Data());
}
public structure_Data finishStructureData(structure_Data data) {
if (storeBaseClassesInStructure)
data.storeBaseClasses = true;
return data;
}
public void clearConcepts() {
for (Concept c : allConcepts()) c.delete();
}
public void fireLegacyChangeEvent() {
synchronized (this) {
++changes;
lastChange = sysNow();
}
if (vmBusSend)
vmBus_send("conceptsChanged", this);
pcallFAll(onAllChanged);
}
synchronized public void autoSaveConcepts() {
if (autoSaver == null) {
if (isTransient())
throw fail("Can't persist transient database");
autoSaver = doEvery_daemon("Concepts Saver for " + conceptsDir(), abs(autoSaveInterval), new Runnable() {
public void run() {
try {
_autoSaveConcepts();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "_autoSaveConcepts()";
}
});
}
}
public void close() {
cleanMeUp();
}
public void cleanMeUp() {
try {
if (closeConceptsOnExit)
closeAllOpt(allConcepts());
defunct = true;
boolean shouldSave = autoSaver != null;
if (autoSaver != null) {
autoSaver.cancel();
autoSaver = null;
}
while (savingConcepts) sleepInCleanUp(10);
if (shouldSave)
saveConceptsIfDirty();
} catch (Throwable __e) {
printStackTrace(__e);
}
{
cleanUp(fileLock);
fileLock = null;
}
}
public Map getIDsAndNames() {
Map map = new HashMap();
Map cloned = cloneMap(concepts);
for (long id : keys(cloned)) map.put(id, cloned.get(id).className);
return map;
}
public void deleteConcepts(List l) {
ping();
if (l != null)
for (Object o : cloneList(l)) if (o instanceof Long) {
Concept c = concepts.get(o);
if (c != null)
c.delete();
} else if (o instanceof Concept)
((Concept) o).delete();
else
warn("Can't delete " + getClassName(o));
}
public A conceptOfType(Class type) {
IConceptCounter counter = conceptCounterForClass(type);
if (counter != null)
return (A) first(counter.allConcepts());
return firstOfType(allConcepts(), type);
}
public List conceptsOfType(Class type) {
List l = conceptsOfType_noParent(type);
if (parent == null)
return l;
return concatLists_conservative(l, parent.conceptsOfType(type));
}
public List conceptsOfType_noParent(Class type) {
ping();
IConceptCounter counter = conceptCounterForClass(type);
if (counter != null)
return (List ) cloneList(counter.allConcepts());
return filterByType(allConcepts(), type);
}
public List listConcepts(Class type) {
return conceptsOfType(type);
}
public List list(Class type) {
return conceptsOfType(type);
}
public List list_noParent(Class type) {
return conceptsOfType_noParent(type);
}
public List list(String type) {
return conceptsOfType(type);
}
public List conceptsOfType(String type) {
return filterByDynamicType(allConcepts(), "main$" + type);
}
public boolean hasConceptOfType(Class extends Concept> type) {
return hasType(allConcepts(), type);
}
public void persistConcepts() {
loadConcepts();
autoSaveConcepts();
}
public void conceptPersistence() {
persistConcepts();
}
public Concepts persist() {
persistConcepts();
return this;
}
public void persist(Integer interval) {
if (interval != null)
autoSaveInterval = interval;
persist();
}
public A ensureHas(Class c, Runnable r) {
A a = conceptOfType(c);
if (a == null) {
r.run();
a = conceptOfType(c);
if (a == null)
throw fail("Concept not made by " + r + ": " + shortClassName(c));
}
return a;
}
public void ensureHas(Class extends Concept> c1, Class extends Concept> c2, Object func) {
for (Concept a : conceptsOfType(c1)) {
Concept b = findBackRef(a, c2);
if (b == null) {
callF(func, a);
b = findBackRef(a, c2);
if (b == null)
throw fail("Concept not made by " + func + ": " + shortClassName(c2));
}
}
}
public void forEvery(Class extends Concept> type, Object func) {
for (Concept c : conceptsOfType(type)) callF(func, c);
}
public int deleteAll(Class extends Concept> type) {
List l = (List) conceptsOfType(type);
for (Concept c : l) c.delete();
return l(l);
}
public Collection allConcepts() {
synchronized (concepts) {
return new ArrayList(values(concepts));
}
}
public IConceptCounter conceptCounterForClass(Class extends Concept> c) {
for (IFieldIndex idx : values(mapGet(fieldIndices, c))) if (idx instanceof IConceptCounter)
return ((IConceptCounter) idx);
for (IFieldIndex idx : values(mapGet(ciFieldIndices, c))) if (idx instanceof IConceptCounter)
return ((IConceptCounter) idx);
return null;
}
public int countConcepts(Class c, Object... params) {
int n = countConcepts_noParent(c, params);
if (parent == null)
return n;
return n + parent.countConcepts(c, params);
}
public int countConcepts_noParent(Class c, Object... params) {
ping();
if (empty(params)) {
IConceptCounter counter = conceptCounterForClass(c);
if (counter != null)
return counter.countConcepts();
return l(list_noParent(c));
}
int n = 0;
for (A x : list_noParent(c)) if (checkConceptFields(x, params))
++n;
return n;
}
public int countConcepts(String c, Object... params) {
ping();
if (empty(params))
return l(list(c));
int n = 0;
for (Concept x : list(c)) if (checkConceptFields(x, params))
++n;
return n;
}
public int countConcepts() {
return l(concepts);
}
synchronized public List clonedConceptIndices() {
return cloneList(conceptIndices);
}
synchronized public void addConceptIndex(IConceptIndex index) {
if (conceptIndices == null)
conceptIndices = new ArrayList();
conceptIndices.add(index);
}
synchronized public void removeConceptIndex(IConceptIndex index) {
if (conceptIndices == null)
return;
conceptIndices.remove(index);
if (empty(conceptIndices))
conceptIndices = null;
}
synchronized public void addFieldIndex(Class extends Concept> c, String field, IFieldIndex index) {
if (fieldIndices == null)
fieldIndices = new HashMap();
Map map = fieldIndices.get(c);
if (map == null)
fieldIndices.put(c, map = new HashMap());
map.put(field, index);
}
synchronized public void removeFieldIndex(Class extends Concept> c, String field, IFieldIndex index) {
Map map = mapGet(fieldIndices, c);
mapRemove(map, field);
}
synchronized public IFieldIndex getFieldIndex(Class extends Concept> c, String field) {
if (fieldIndices == null)
return null;
Map map = fieldIndices.get(c);
return map == null ? null : map.get(field);
}
synchronized public IFieldIndex getAnyIndexForClass(Class extends Concept> c) {
return first(allIndicesForClass(c));
}
synchronized public Collection allIndicesForClass(Class extends Concept> c) {
return concatLists(values(fieldIndices == null ? null : fieldIndices.get(c)), values(ciFieldIndices == null ? null : ciFieldIndices.get(c)));
}
synchronized public void addCIFieldIndex(Class extends Concept> c, String field, IFieldIndex index) {
if (ciFieldIndices == null)
ciFieldIndices = new HashMap();
Map map = ciFieldIndices.get(c);
if (map == null)
ciFieldIndices.put(c, map = new HashMap());
map.put(field, index);
}
synchronized public void removeCIFieldIndex(Class extends Concept> c, String field) {
Map map = mapGet(ciFieldIndices, c);
mapRemove(map, field);
}
synchronized public IFieldIndex getCIFieldIndex(Class extends Concept> c, String field) {
if (ciFieldIndices == null)
return null;
Map map = ciFieldIndices.get(c);
return map == null ? null : map.get(field);
}
public RC xnew(String name, Object... values) {
return new RC(cnew(name, values));
}
public void xset(long id, String field, Object value) {
xset(new RC(id), field, value);
}
public void xset(RC c, String field, Object value) {
if (value instanceof RC)
value = getConcept((RC) value);
cset(getConcept(c), field, value);
}
public Object xget(long id, String field) {
return xget(new RC(id), field);
}
public Object xget(RC c, String field) {
return xgetPost(cget(getConcept(c), field));
}
public Object xgetPost(Object o) {
o = deref(o);
if (o instanceof Concept)
return new RC((Concept) o);
return o;
}
public void xdelete(long id) {
xdelete(new RC(id));
}
public void xdelete(RC c) {
getConcept(c).delete();
}
public void xdelete(List l) {
for (RC c : l) xdelete(c);
}
public List xlist() {
return map("toPassRef", allConcepts());
}
public List xlist(String className) {
return map("toPassRef", conceptsOfType(className));
}
public boolean isTransient() {
return eq(programID, "-");
}
public String xfullgrab() {
if (noXFullGrab)
throw fail("no xfullgrab (DB too large)");
Lock __1 = lock();
lock(__1);
try {
if (changes == changesWritten && !isTransient())
return loadConceptsStructure(programID);
return fullStructure();
} finally {
unlock(__1);
}
}
public void xshutdown() {
cleanKillVM();
}
public long xchangeCount() {
return changes;
}
public int xcount() {
return countConcepts();
}
public void register(Concept c) {
ping();
if (c._concepts == this)
return;
if (c._concepts != null)
throw fail("Can't re-register");
c.id = internalID();
c.created = now();
if (modifyOnCreate)
c._setModified(c.created);
register_phase2(c);
vmBus_send("conceptCreated", c);
fireChange(new ConceptCreate(c));
}
public void register_phase2(Concept c) {
c._concepts = this;
concepts.put((long) c.id, c);
for (Concept.Ref r : c._refs()) r.index();
c.change();
c._onRegistered();
}
public void registerKeepingID(Concept c) {
if (c._concepts == this)
return;
if (c._concepts != null)
throw fail("Can't re-register");
c._concepts = this;
concepts.put((long) c.id, c);
c.change();
}
public void conceptChanged(Concept c) {
fireChange(new ConceptChange(c));
if (conceptIndices != null)
for (IConceptIndex index : clonedConceptIndices()) index.update(c);
}
public boolean hasUnsavedData() {
return changes != changesWritten || savingConcepts;
}
synchronized public Object miscMapGet(Object key) {
return mapGet(miscMap, key);
}
synchronized public Object miscMapPut(Object key, Object value) {
if (miscMap == null)
miscMap = new HashMap();
return miscMap.put(key, value);
}
synchronized public void miscMapRemove(Object key) {
mapRemove(miscMap, key);
}
synchronized public A miscMapGetOrCreate(Object key, IF0 create) {
if (containsKey(miscMap, key))
return (A) miscMap.get(key);
A value = create.get();
miscMapPut(key, value);
return value;
}
public void setParent(Concepts parent) {
this.parent = parent;
}
public void fireChange(ConceptsChange change) {
if (change == null)
return;
pcallFAll(onChange, change);
fireLegacyChangeEvent();
}
final public void onChange(IVF1 l) {
addChangeListener(l);
}
public void addChangeListener(IVF1 l) {
syncAdd(onChange, l);
}
public void removeChangeListener(IVF1 l) {
syncRemove(onChange, l);
}
public void addPreSave(Runnable r) {
preSave = syncAddOrCreate(preSave, r);
}
public String toString() {
return nConcepts(concepts) + " (" + conceptsDir() + ", hash: " + identityHashCode(this) + ")";
}
}
public interface IConcept {
public long _conceptID();
public Concepts concepts();
}
static public class Concept extends DynamicObject implements IConcept, ChangeTriggerable {
transient public Concepts _concepts;
public long id;
public long created, _modified;
public List[ backRefs;
public Concept(String className) {
super(className);
_created();
}
public Concept() {
if (!_loading()) {
_created();
}
}
public Concept(boolean unlisted) {
if (!unlisted)
_created();
}
public boolean includeZeroIDInToString() {
return false;
}
public String toString() {
String s = shortDynamicClassName(this);
long id = this.id;
if (id != 0 || includeZeroIDInToString())
s += " " + id;
return s;
}
static public boolean loading() {
return _loading();
}
static public boolean _loading() {
return dynamicObjectIsLoading();
}
public void _created() {
if (!concepts_unlistedByDefault && !eq(concepts_unlisted.get(), true))
db_mainConcepts().register(this);
}
public class TypedRef] extends Ref {
public TypedRef() {
}
public Class bType;
public TypedRef(Class bType) {
this.bType = bType;
}
public TypedRef(Class bType, B value) {
this.bType = bType;
set((A) value);
}
public TypedRef(B value) {
set((A) value);
}
public boolean set(A a) {
return super.set(checkValue(a));
}
public void check() {
checkValue(get());
}
public C checkValue(C a) {
if (bType != null && a != null)
assertIsInstance(a, bType);
return a;
}
public B b() {
return (B) value;
}
}
public class Ref implements IRef {
public A value;
public Ref() {
if (!dynamicObjectIsLoading())
registerRef();
}
public void registerRef() {
vmBus_send("registeringConceptRef", this);
}
public Ref(A value) {
this.value = value;
registerRef();
index();
}
public Concept concept() {
return Concept.this;
}
public A get() {
return value;
}
public boolean has() {
return value != null;
}
public boolean set(A a) {
if (a == value)
return false;
unindex();
value = a;
index();
change();
return true;
}
public void setIfEmpty(A a) {
if (!has())
set(a);
}
public void set(Ref ref) {
set(ref.get());
}
public void clear() {
set((A) null);
}
public boolean validRef() {
return value != null && _concepts != null && _concepts == value._concepts;
}
public void index() {
if (validRef()) {
value._addBackRef(this);
change();
}
}
public Ref unindex() {
if (validRef()) {
value._removeBackRef(this);
change();
}
return this;
}
public void unindexAndDrop() {
unindex();
_removeRef(this);
}
public void change() {
Concept.this.change();
}
public String toString() {
return str(value);
}
}
public class RefL extends AbstractList {
public List[> l = new ArrayList();
public RefL() {
}
public RefL(List] l) {
replaceWithList(l);
}
public void clear() {
while (!isEmpty()) removeLast(this);
}
public void replaceWithList(List l) {
clear();
for (A a : unnullForIteration(l)) add(a);
}
public A set(int i, A o) {
Ref ref = syncGet(l, i);
A prev = ref.get();
ref.set(o);
return prev;
}
public void add(int i, A o) {
syncAdd(l, i, new Ref(o));
}
public A get(int i) {
return syncGet(l, i).get();
}
public A remove(int i) {
return syncRemove(l, i).get();
}
public int size() {
return syncL(l);
}
public boolean contains(Object o) {
if (o instanceof Concept)
for (Ref r : l) if (eq(r.get(), o))
return true;
return super.contains(o);
}
}
public void delete() {
for (Ref r : unnullForIteration(_refs())) r.unindex();
for (Ref r : cloneList(backRefs)) r.set((Concept) null);
backRefs = null;
var _concepts = this._concepts;
if (_concepts != null) {
_concepts.concepts.remove(id);
_concepts.fireChange(new ConceptDelete(id, this));
if (_concepts.conceptIndices != null)
for (IConceptIndex index : _concepts.conceptIndices) index.remove(this);
this._concepts = null;
}
id = 0;
}
public BaseXRef export() {
return new BaseXRef(_concepts.progID(), id);
}
final public void _change() {
change();
}
public void change() {
_setModified(now());
_change_withoutUpdatingModifiedField();
}
public void _setModified(long modified) {
_modified = modified;
}
final public void _change_withoutUpdatingModifiedField() {
_onChange();
if (_concepts != null)
_concepts.conceptChanged(this);
}
public void _onChange() {
}
public String _programID() {
return _concepts == null ? getDBProgramID() : _concepts.progID();
}
public void _addBackRef(Concept.Ref ref) {
backRefs = addDyn_quickSync(backRefs, ref);
_backRefsModified();
}
public void _backRefsModified() {
if (_concepts != null && _concepts.modifyOnBackRef)
change();
}
public void _removeBackRef(Concept.Ref ref) {
backRefs = removeDyn_quickSync(backRefs, ref);
_backRefsModified();
}
public void _removeRef(Concept.Ref ref) {
}
public int _backRefCount() {
return syncL(backRefs);
}
final public void setField(String field, Object value) {
_setField(field, value);
}
public void _setField(String field, Object value) {
cset(this, field, value);
}
public boolean setField_trueIfChanged(String field, Object value) {
return cset(this, field, value) != 0;
}
public A setFieldAndReturn(String field, A value) {
setField(field, value);
return value;
}
final public void setFields(Object... values) {
_setFields(values);
}
public void _setFields(Object... values) {
cset(this, values);
}
public Concepts concepts() {
return _concepts;
}
public boolean isDeleted() {
return id == 0;
}
public void _doneLoading() {
}
public void _doneLoading2() {
Map map = _fieldMigrations();
if (map != null)
for (Map.Entry extends String, ? extends FieldMigration> __0 : _entrySet(map)) {
String oldField = __0.getKey();
FieldMigration m = __0.getValue();
crenameField_noOverwrite(this, oldField, m.newField);
}
}
static public class FieldMigration implements IFieldsToList {
public String newField;
public FieldMigration() {
}
public FieldMigration(String newField) {
this.newField = newField;
}
public String toString() {
return shortClassName_dropNumberPrefix(this) + "(" + newField + ")";
}
public boolean equals(Object o) {
if (!(o instanceof FieldMigration))
return false;
FieldMigration __6 = (FieldMigration) o;
return eq(newField, __6.newField);
}
public int hashCode() {
int h = 558692372;
h = boostHashCombine(h, _hashCode(newField));
return h;
}
public Object[] _fieldsToList() {
return new Object[] { newField };
}
}
public Map _fieldMigrations() {
return null;
}
public Collection[ _refs() {
return scanConceptForRefs(this);
}
public Concepts _concepts() {
return _concepts;
}
public boolean _conceptsDefunct() {
return _concepts != null && _concepts.defunct;
}
public boolean _conceptsDefunctOrUnregistered() {
return _concepts == null || _concepts.defunct;
}
public void _onRegistered() {
}
public ] boolean addAndChange(Collection cl, A a) {
if (cl == null || !cl.add(a))
return false;
change();
return true;
}
public void clearAndChange(Collection cl) {
if (cl == null)
return;
cl.clear();
change();
}
public File conceptsDir() {
var concepts = concepts();
return concepts == null ? null : concepts.conceptsDir();
}
public File fileInConceptsDir(String name) {
var dir = conceptsDir();
return dir == null ? null : newFile(dir, name);
}
public long _conceptID() {
return id;
}
}
static public class RC {
transient public Object owner;
public String id;
public RC() {
}
public RC(long id) {
this.id = str(id);
}
public RC(Object owner, long id) {
this.id = str(id);
this.owner = owner;
}
public RC(Concept c) {
this(c.id);
}
public long longID() {
return parseLong(id);
}
public String toString() {
return id;
}
transient public RemoteDB db;
public String getString(String field) {
return db.xS(this, field);
}
public Object get(String field) {
return db.xget(this, field);
}
public void set(String field, Object value) {
db.xset(this, field, value);
}
}
static public class BaseXRef {
public String programID;
public long id;
public BaseXRef() {
}
public BaseXRef(String programID, long id) {
this.id = id;
this.programID = programID;
}
public boolean equals(Object o) {
if (!(o instanceof BaseXRef))
return false;
BaseXRef r = (BaseXRef) o;
return eq(programID, r.programID) && eq(id, r.id);
}
public int hashCode() {
return programID.hashCode() + (int) id;
}
}
static public class XRef extends Concept {
public BaseXRef ref;
public XRef() {
}
public XRef(BaseXRef ref) {
this.ref = ref;
_doneLoading2();
}
public void _doneLoading2() {
getIndex().put(ref, this);
}
public HashMap getIndex() {
return getXRefIndex(_concepts);
}
}
static synchronized public HashMap getXRefIndex(Concepts concepts) {
HashMap cache = (HashMap) concepts.perClassData().get(XRef.class);
if (cache == null)
concepts.perClassData.put(XRef.class, cache = new HashMap());
return cache;
}
static public XRef lookupOrCreateXRef(BaseXRef ref) {
XRef xref = getXRefIndex(db_mainConcepts()).get(ref);
if (xref == null)
xref = new XRef(ref);
return xref;
}
static public void loadAndAutoSaveConcepts() {
db_mainConcepts().persist();
}
static public void loadAndAutoSaveConcepts(int interval) {
db_mainConcepts().persist(interval);
}
static public RC toPassRef(Concept c) {
return new RC(c);
}
static public void concepts_setUnlistedByDefault(boolean b) {
concepts_unlistedByDefault = b;
}
static public class EphemeralObjectIDs {
public long idCounter;
public WeakValueMap idToObject = new WeakValueMap();
public Map objectToID = weakIdentityMap();
public EphemeralObjectIDs runnablesReferenceQueue(RunnablesReferenceQueue queue) {
idToObject.queue(queue);
return this;
}
synchronized public long remember(Object o) {
if (o == null)
return 0;
{
var __1 = objectToID.get(o);
if (__1 != null)
return __1;
}
long id = ++idCounter;
idToObject.put(id, o);
objectToID.put(o, id);
return id;
}
synchronized public Object get(long id) {
if (id == 0)
return null;
return idToObject.get(id);
}
synchronized public boolean wasGarbageCollected(long id) {
return id > 0 && id <= idCounter && get(id) == null;
}
}
static public interface IF1 {
public B get(A a);
}
static public class RunnablesReferenceQueue implements AutoCloseable {
public ReferenceQueue queue = new ReferenceQueue();
volatile public Thread thread;
public Flag closed = new Flag();
final public RunnablesReferenceQueue setTimeout(int timeout) {
return timeout(timeout);
}
public RunnablesReferenceQueue timeout(int timeout) {
this.timeout = timeout;
return this;
}
final public int getTimeout() {
return timeout();
}
public int timeout() {
return timeout;
}
public int timeout = 60000;
public RunnablesReferenceQueue() {
thread = startThread("RunnablesReferenceQueue", () -> _run());
}
public void _run() {
try {
try {
while (ping() && !closed.get()) {
Reference> ref = queue.remove(timeout);
if (ref != null) {
if (ref instanceof Runnable)
pcallF((Runnable) ref);
else
warn("RunnablesReferenceQueue: Reference not runnable - " + className(ref));
}
}
} catch (InterruptedException e) {
} finally {
thread = null;
}
} catch (Exception __e) {
throw rethrow(__e);
}
}
public void close() {
try {
closed.raise();
interruptThread(thread);
} catch (Exception __e) {
throw rethrow(__e);
}
}
final public ReferenceQueue get() {
return queue();
}
public ReferenceQueue queue() {
return queue;
}
}
public interface ILASClassLoader {
public Class> defineLASClass(String name, IF0 generateClass);
public Object rememberClassBytes(boolean rememberClassBytes);
}
public interface IG22LoadedDB {
public boolean hidden();
public Concepts concepts();
public JFrame mainWindow();
public G22Utils g22utils();
public void activate();
}
static public class FileBasedLock implements AutoCloseable {
public File lockFile;
public double timeout = 60.0;
public boolean verbose = false;
public boolean haveLock = false;
public java.util.Timer touchTimer;
final public FileBasedLock setContentsForLockFile(String contentsForLockFile) {
return contentsForLockFile(contentsForLockFile);
}
public FileBasedLock contentsForLockFile(String contentsForLockFile) {
this.contentsForLockFile = contentsForLockFile;
return this;
}
final public String getContentsForLockFile() {
return contentsForLockFile();
}
public String contentsForLockFile() {
return contentsForLockFile;
}
public String contentsForLockFile;
public FileBasedLock() {
}
public FileBasedLock(File lockFile) {
this.lockFile = lockFile;
}
public FileBasedLock(File lockFile, double timeout) {
this.timeout = timeout;
this.lockFile = lockFile;
}
synchronized public boolean tryToLock() {
if (haveLock)
return true;
if (fileExists(lockFile)) {
double age = fileAgeInSeconds(lockFile);
double remaining = timeout - age;
print("Lock file age: " + lockFile + ": " + iround(age) + " s" + (remaining <= 0 ? " - old, deleting" : " - please start again in " + nSeconds(iceil(remaining))));
if (remaining <= 0) {
print("Deleting old lock file (program crashed?): " + lockFile + " (age: " + iround(age) + " seconds)");
deleteFile(lockFile);
}
}
try {
mkdirsForFile(lockFile);
java.nio.file.Files.createFile(toPath(lockFile));
if (nempty(contentsForLockFile))
writeContents();
acquired();
return true;
} catch (Throwable e) {
printExceptionShort("Can't lock", e);
return false;
}
}
public void writeContents() {
saveTextFileWithoutTemp(lockFile, unnull(contentsForLockFile));
}
private void acquired() {
haveLock = true;
startTouchTimer();
}
public void forceLock() {
try {
print("Force-locking " + lockFile);
writeContents();
acquired();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String lockError() {
return "Couldn't aquire lock file: " + lockFile;
}
public void lockOrFail() {
if (!tryToLock())
throw fail(lockError());
}
synchronized public void startTouchTimer() {
if (touchTimer != null)
return;
double interval = timeout / 2;
touchTimer = doEvery(interval, new Runnable() {
public void run() {
try {
doTouch();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "doTouch();";
}
});
if (verbose)
print("Touch timer started for " + lockFile + " (" + interval + "s)");
}
synchronized public void doTouch() {
try {
if (haveLock) {
if (verbose)
print("Touching lock file: " + lockFile);
touchExistingFile(lockFile);
}
} catch (Throwable __e) {
printStackTrace(__e);
}
}
public synchronized void close() {
try {
{
cleanUp(touchTimer);
touchTimer = null;
}
if (haveLock) {
haveLock = false;
if (verbose)
print("Deleting lock file: " + lockFile);
deleteFile(lockFile);
}
} catch (Throwable __e) {
printStackTrace(__e);
}
}
synchronized public void _simulateCrash() {
{
cleanUp(touchTimer);
touchTimer = null;
}
}
public void deleteOnExit() {
if (haveLock)
lockFile.deleteOnExit();
}
public String actualContents() {
return loadTextFile(lockFile);
}
public boolean hasExpectedContents() {
return eq(unnull(contentsForLockFile), actualContents());
}
}
public interface IF0WithChangeListeners extends IF0 , IHasChangeListeners {
}
static public interface IConceptCounter {
public Class extends Concept> conceptClass();
public int countConcepts();
public Collection allConcepts();
}
static public interface IRef extends IF0 {
public default void replaceValue(A oldValue, A newValue) {
}
}
static public class G22Utils_Base {
transient public Set> onProjectFileChanged;
public G22Utils_Base onProjectFileChanged(IVF1 f) {
onProjectFileChanged = createOrAddToSyncLinkedHashSet(onProjectFileChanged, f);
return this;
}
public G22Utils_Base removeProjectFileChangedListener(IVF1 f) {
main.remove(onProjectFileChanged, f);
return this;
}
public void projectFileChanged(File file) {
if (onProjectFileChanged != null)
for (var listener : onProjectFileChanged) pcallF_typed(listener, file);
}
}
static public class G22Utils extends G22Utils_Base implements AutoCloseable, TransientObject {
final public G22Utils setBackgroundProcessesUI(IBackgroundProcesses backgroundProcessesUI) {
return backgroundProcessesUI(backgroundProcessesUI);
}
public G22Utils backgroundProcessesUI(IBackgroundProcesses backgroundProcessesUI) {
this.backgroundProcessesUI = backgroundProcessesUI;
return this;
}
final public IBackgroundProcesses getBackgroundProcessesUI() {
return backgroundProcessesUI();
}
public IBackgroundProcesses backgroundProcessesUI() {
return backgroundProcessesUI;
}
public IBackgroundProcesses backgroundProcessesUI;
final public G22Utils setModule(Enterable module) {
return module(module);
}
public G22Utils module(Enterable module) {
this.module = module;
return this;
}
final public Enterable getModule() {
return module();
}
public Enterable module() {
return module;
}
public Enterable module;
final public G22Utils setMasterStuff(G22MasterStuff masterStuff) {
return masterStuff(masterStuff);
}
public G22Utils masterStuff(G22MasterStuff masterStuff) {
this.masterStuff = masterStuff;
return this;
}
final public G22MasterStuff getMasterStuff() {
return masterStuff();
}
public G22MasterStuff masterStuff() {
return masterStuff;
}
public G22MasterStuff masterStuff;
final public G22Utils setConcepts(Concepts concepts) {
return concepts(concepts);
}
public G22Utils concepts(Concepts concepts) {
this.concepts = concepts;
return this;
}
final public Concepts getConcepts() {
return concepts();
}
public Concepts concepts() {
return concepts;
}
public Concepts concepts;
final public G22Utils setProjectActions(G22ProjectActions projectActions) {
return projectActions(projectActions);
}
public G22Utils projectActions(G22ProjectActions projectActions) {
this.projectActions = projectActions;
return this;
}
final public G22ProjectActions getProjectActions() {
return projectActions();
}
public G22ProjectActions projectActions() {
return projectActions;
}
public G22ProjectActions projectActions;
final public G22AutoStarter getAutoStarter() {
return autoStarter();
}
public G22AutoStarter autoStarter() {
return autoStarter;
}
public G22AutoStarter autoStarter = new G22AutoStarter(this);
final public G22Utils setFunctionTimings(FunctionTimings functionTimings) {
return functionTimings(functionTimings);
}
public G22Utils functionTimings(FunctionTimings functionTimings) {
this.functionTimings = functionTimings;
return this;
}
final public FunctionTimings getFunctionTimings() {
return functionTimings();
}
public FunctionTimings functionTimings() {
return functionTimings;
}
public FunctionTimings functionTimings = new FunctionTimings();
final public Set getAutoClosingResources() {
return autoClosingResources();
}
public Set autoClosingResources() {
return autoClosingResources;
}
public Set autoClosingResources = syncLinkedHashSet();
public FileWatchService fileWatcher;
public boolean projectFileListenerInitiated = false;
final public CombinedStringifier getStringifier() {
return stringifier();
}
public CombinedStringifier stringifier() {
return stringifier;
}
public CombinedStringifier stringifier = new CombinedStringifier(o -> o instanceof BufferedImage ? "Image (" + ((BufferedImage) o).getWidth() + "*" + ((BufferedImage) o).getHeight() + " px)" : null);
public ILASClassLoader lasClassLoader() {
return masterStuff == null ? null : masterStuff.lasClassLoader();
}
public ImageSurface stdImageSurface_noToolTip() {
return stdImageSurface_noToolTip(imageSurface());
}
public ImageSurface stdImageSurface_noToolTip(ImageSurface is) {
imageSurface_pixelated(is);
is.setAutoZoomToDisplay(true).repaintInThread(false);
is.defaultImageDir = () -> dbDir();
is.specialPurposed = true;
return is;
}
public ImageSurface stdImageSurface() {
return stdImageSurface(imageSurface());
}
public ImageSurface stdImageSurface(ImageSurface is) {
stdImageSurface_noToolTip(is);
new ImageSurface_PositionToolTip(is);
return is;
}
public List stdImageSurfaces(Collection images) {
return map(__47 -> stdImageSurface(__47), toBufferedImages(images));
}
public ImageSurface stdImageSurface(MakesBufferedImage img) {
return stdImageSurface(toBufferedImage(img));
}
public ImageSurface stdImageSurface(BufferedImage img) {
var is = stdImageSurface();
is.setImage(img);
return is;
}
public ImageSurface stdImageSurface(File file) {
var is = stdImageSurface();
is.setImage(file);
return is;
}
public ImageSurface stdImageSurface(G22GalleryImage img) {
return stdImageSurface(img == null ? null : img.path);
}
public ImageSurface stdImageSurfaceWithSelection(MakesBufferedImage img, Rect selection) {
return stdImageSurfaceWithSelection(toBufferedImage(img), selection);
}
public ImageSurface stdImageSurfaceWithSelection(BufferedImage img, Rect selection) {
var is = stdImageSurface(img);
is.setSelection(selection);
return is;
}
public String stringify(Object o) {
return stringifier.toString(o);
}
transient public Set> onSettingUpParser;
public G22Utils onSettingUpParser(IVF1 f) {
onSettingUpParser = createOrAddToSyncLinkedHashSet(onSettingUpParser, f);
return this;
}
public G22Utils removeSettingUpParserListener(IVF1 f) {
main.remove(onSettingUpParser, f);
return this;
}
public void settingUpParser(GazelleV_LeftArrowScriptParser parser) {
if (onSettingUpParser != null)
for (var listener : onSettingUpParser) pcallF_typed(listener, parser);
}
transient public Set> onSettingUpScriptIDE;
public G22Utils onSettingUpScriptIDE(IVF1 f) {
onSettingUpScriptIDE = createOrAddToSyncLinkedHashSet(onSettingUpScriptIDE, f);
return this;
}
public G22Utils removeSettingUpScriptIDEListener(IVF1 f) {
main.remove(onSettingUpScriptIDE, f);
return this;
}
public void settingUpScriptIDE(JLeftArrowScriptIDE ide) {
if (onSettingUpScriptIDE != null)
for (var listener : onSettingUpScriptIDE) pcallF_typed(listener, ide);
}
public GazelleV_LeftArrowScriptParser leftArrowParser() {
GazelleV_LeftArrowScriptParser parser = new GazelleV_LeftArrowScriptParser();
parser.classNameResolver(classNameResolver());
parser.lasClassLoader(lasClassLoader());
settingUpParser(parser);
parser.addClassAlias("Freq", "Frequency");
parser.addClassAlias("MRUAndAllTimeTop", "MRUAndAllTimeTop_optimized");
return parser;
}
public Object leftArrow(String script) {
return leftArrowParse(script).get();
}
public GazelleV_LeftArrowScript.Script leftArrowParse(String script) {
return leftArrowParser().parse(script);
}
public Object leftArrowWithVars(String script, Object... vars) {
var parser = leftArrowParser();
for (int i = 0; i < l(vars); i += 2) parser.addVar((String) vars[i], or(_getClass(vars[i + 1]), Object.class), true);
var parsed = parser.parse(script);
FlexibleVarContext varContext = new FlexibleVarContext();
for (int i = 0; i < l(vars); i += 2) varContext.set((String) vars[i], vars[i + 1]);
return parsed.get(varContext);
}
public void basicParserTest() {
var parser = leftArrowParser();
print("classContainerPrefixes", parser.classContainerPrefixes());
assertEquals(pair(1, 2), parser.parse("new Pair 1 2").get());
}
public JLeftArrowScriptIDE leftArrowIDE() {
JLeftArrowScriptIDE ide = new JLeftArrowScriptIDE();
ide.g22utils(this);
ide.scriptTimeout(projectWideScriptTimeout());
settingUpScriptIDE(ide);
return ide;
}
public File byteCodePath() {
return assertNotNull(getBytecodePathForClass(this));
}
public ClassNameResolver classNameResolver_cache;
public ClassNameResolver classNameResolver() {
if (classNameResolver_cache == null)
classNameResolver_cache = classNameResolver_load();
return classNameResolver_cache;
}
public ClassNameResolver classNameResolver_load() {
return new ClassNameResolver().byteCodePath(byteCodePath()).init();
}
public File databasesMotherDir() {
return masterStuff.databasesMotherDir();
}
public File dirOfProjectNamed(String name) {
assertNempty(name);
return newFile(databasesMotherDir(), name);
}
public AutoCloseable enter() {
return module == null ? null : module.enter();
}
public String defaultDBName() {
return "Default";
}
public File lastOpenedDBsFile() {
return newFile(databasesMotherDir(), "Last Opened");
}
public File recentlyOpenedDBsFile() {
return newFile(databasesMotherDir(), "Recently Opened");
}
public File autoUpdateFile() {
return newFile(databasesMotherDir(), "Auto-Update");
}
public boolean autoUpdateEnabled() {
return fileExists(autoUpdateFile());
}
public void setAutoUpdate(boolean b) {
createOrRemoveFile(autoUpdateFile(), b);
}
public List dbsToOpen() {
return loadRecentProjectsFile(lastOpenedDBsFile());
}
public List dbNamesRecentlyOpened() {
return loadRecentProjectsFile(recentlyOpenedDBsFile());
}
public void addToRecentDBNames(String dbName, boolean hidden) {
List list = dbNamesRecentlyOpened();
List list2 = cloneList(list);
removeAll(list2, dbName, "*" + dbName);
list2.add(0, hidden ? "*" + dbName : dbName);
truncateList(list2, 100);
if (!eq(list, list2))
saveTextFile(recentlyOpenedDBsFile(), lines(list2));
}
public List loadRecentProjectsFile(File file) {
List dbNames = new ArrayList();
for (String name : tlft(loadTextFile(file))) {
String name2 = dropPrefix("*", name);
if (fileExists(newFile(databasesMotherDir(), name2)))
dbNames.add(name);
}
if (empty(dbNames))
dbNames.add(defaultDBName());
return dbNames;
}
public void setOpenDBs(Collection extends IG22LoadedDB> dbs) {
List dbNames = new ArrayList();
for (var db : dbs) {
var dbDir = conceptsDir(db.concepts());
if (sameFile(databasesMotherDir(), dirOfFile(dbDir)))
dbNames.add((db.hidden() ? "*" : "") + fileName(dbDir));
}
saveTextFile(lastOpenedDBsFile(), lines(dbNames));
}
public void setupScriptCRUD(SimpleCRUD_v2 crud) {
setupScriptCRUD(crud, false);
}
public void setupScriptCRUD(SimpleCRUD_v2 crud, boolean allowRunOnProjectOpen) {
crud.useNewChangeHandler(true);
crud.editableFieldsForItem = x -> llNonNulls("description", allowRunOnProjectOpen ? "runOnProjectOpen" : null, allowRunOnProjectOpen ? "runOrder" : null);
crud.multiLineField("text");
crud.multiLineField("editingText");
crud.makeTextArea = text -> jMinHeight(200, crud.makeTextArea_base(text));
crud.humanizeFieldNames = false;
crud.iconButtons(true);
crud.itemToMap_inner2 = c -> scriptToMap(c, allowRunOnProjectOpen);
crud.dontDuplicateFields = litset("runOnProjectOpen", "runOrder", "runCount", "lastResultByMode");
}
public Map scriptToMap(G22LeftArrowScript c) {
return scriptToMap(c, false);
}
public Map scriptToMap(G22LeftArrowScript c, boolean allowRunOnProjectOpen) {
return litorderedmap("Description", str(c), "Status", renderScriptStatus(c), "LoC", renderScriptLoC(c), "Import note", c.importNote, "Run on project open", c.renderRunOnProjectOpenStatus());
}
public String renderScriptStatus(G22LeftArrowScript c) {
return or2_rev("Empty", joinNemptiesWithSpacedPlus(c.isClearForAutoRun() ? "Clear for auto-run" : null, c.isSavedDistinctFromAutoRunVersion() ? "Saved (not cleared)" : null, c.isEditing() ? "Editing" : null));
}
public String renderScriptLoC(G22LeftArrowScript c) {
return n2(intMax(mapLL(__48 -> linesOfCode_javaTok(__48), c.editingText, c.text, c.codeForAutoRun())));
}
public List labelsForFile(File file) {
if (file == null)
return null;
File labelsFile = appendToFileName(file, ".labels");
List labels = tlft(loadTextFile(labelsFile));
return map(__49 -> getLabel(__49), labels);
}
public File labelsFile(File file) {
if (file == null)
return null;
return appendToFileName(file, ".labels");
}
public void setLabelsForFile(File file, List labels) {
List list = map(labels, label -> label.name);
File f = labelsFile(file);
saveTextFile(f, lines(list));
print("Saved " + nLabels(list) + " (" + joinWithComma(list) + ") to " + f);
}
public G22Label getLabel(String name) {
if (empty(name))
return null;
if (containsNewLine(name))
throw fail("No newlines in label names allowed: " + name);
return uniqCI(concepts, G22Label.class, "name", name);
}
final public File projectDir() {
return dbDir();
}
public File dbDir() {
return conceptsDir(concepts);
}
final public File projectFile(String name) {
return fileInDbDir(name);
}
public File fileInDbDir(String name) {
return newFile(dbDir(), name);
}
public class GazelleDB implements IFieldsToList {
public String name;
public File dir;
public GazelleDB() {
}
public GazelleDB(String name, File dir) {
this.dir = dir;
this.name = name;
}
public String toString() {
return shortClassName_dropNumberPrefix(this) + "(" + name + ", " + dir + ")";
}
public boolean equals(Object o) {
if (!(o instanceof GazelleDB))
return false;
GazelleDB __0 = (GazelleDB) o;
return eq(name, __0.name) && eq(dir, __0.dir);
}
public int hashCode() {
int h = 1669530526;
h = boostHashCombine(h, _hashCode(name));
h = boostHashCombine(h, _hashCode(dir));
return h;
}
public Object[] _fieldsToList() {
return new Object[] { name, dir };
}
public String name() {
return name;
}
public File dir() {
return dir;
}
public boolean loaded() {
return loadedDB() != null;
}
public IG22LoadedDB loadedDB_cache;
public IG22LoadedDB loadedDB() {
if (loadedDB_cache == null)
loadedDB_cache = loadedDB_load();
return loadedDB_cache;
}
public IG22LoadedDB loadedDB_load() {
return masterStuff.getLoadedDBForConceptDir(dir);
}
public File conceptsFile() {
return conceptsFileIn(dir);
}
}
public List gazelleDBs() {
List dbs = new ArrayList();
for (File dir : listDirsContainingFileNamed(databasesMotherDir(), "concepts.structure.gz")) dbs.add(new GazelleDB(fileName(dir), dir));
return dbs;
}
public IterableIterator peekAllProjectsConcepts() {
var classFinder = masterStuff.makeClassFinder();
return mapI_pcall(gazelleDBs(), db -> {
var cc = newConceptsWithClassFinder(db.conceptsFile(), classFinder);
cc.loadFromDisk();
return cc;
});
}
public RSyntaxTextAreaWithSearch newSyntaxTextArea() {
return newSyntaxTextArea((IF1) null);
}
public RSyntaxTextAreaWithSearch newSyntaxTextArea(IF1 wrapStatusLabel) {
RSyntaxTextAreaWithSearch ta = new RSyntaxTextAreaWithSearch(wrapStatusLabel);
ta.textArea().setHighlightCurrentLine(false);
ta.menuLessOperation();
return ta;
}
public RSyntaxTextAreaWithSearch newSyntaxTextArea(String text) {
var ta = newSyntaxTextArea();
ta.setText(text);
return ta;
}
public File projectStoryTextFile() {
return newFile(dbDir(), "story.txt");
}
public String projectName() {
return fileName(dbDir());
}
public void close() {
try {
autoStarter.close();
closeAndClear(autoClosingResources);
{
cleanUp(fileWatcher);
fileWatcher = null;
}
} catch (Exception __e) {
throw rethrow(__e);
}
}
public G22Variable findProjectVar(String name) {
return conceptWhereCI(concepts, G22Variable.class, "name", name);
}
public Collection projectVarNames() {
return collect("name", list(concepts, G22Variable.class));
}
public Object getProjectVar(String name) {
G22Variable var = findProjectVar(name);
return var == null ? null : var.value();
}
public Object getOrSetTransientProjectVar(String name, IF0 f) {
{
var __2 = getProjectVar(name);
if (__2 != null)
return __2;
}
return setTransientProjectVarAndReturn(name, f.get());
}
public Object getProjectVarOrCallScript(String name, long scriptID) {
{
var __3 = getProjectVar(name);
if (__3 != null)
return __3;
}
return callScript(scriptID);
}
public Object getProjectVarSetByScript(String name, long scriptID) {
{
var __4 = getProjectVar(name);
if (__4 != null)
return __4;
}
callScript(scriptID);
return getProjectVar(name);
}
public Object getProjectVarFromAnyProject(String name) {
for (var project : masterStuff().openProjects()) {
var __5 = project.g22utils().getProjectVar(name);
if (__5 != null)
return __5;
}
return null;
}
final public List getVarFromAnyProject(String name) {
return getProjectVarFromAllProjects(name);
}
public List getProjectVarFromAllProjects(String name) {
return nonNulls(masterStuff().openProjects(), project -> project.g22utils().getProjectVar(name));
}
public G22Variable projectVarConcept(String name) {
return optimizedUniqCI(concepts, G22Variable.class, "name", name);
}
public Object waitForProjectVar(String name) {
return waitForProjectVar(infinity(), name);
}
public Object waitForProjectVar(double timeoutSeconds, String name) {
G22Variable var = projectVarConcept(name);
return waitForCalculatedValueUsingChangeListener(timeoutSeconds, () -> var.value(), var);
}
public void setBigProjectVar(boolean persistent, String name, Object value) {
if (persistent)
setBigProjectVar(name, value);
else
setTransientProjectVar(name, value);
}
public G22Variable setProjectVar(boolean persistent, String name, Object value) {
G22Variable var = projectVarConcept(name);
if (!persistent)
var.persistent(persistent);
var.value(value);
if (persistent)
var.persistent(persistent);
return var;
}
public void unloadProjectVar(String name) {
var var = findProjectVar(name);
{
if (var != null)
var.unload();
}
}
public A setBigProjectVar(String name, A value) {
setPersistentProjectVar(name, value);
G22Variable var = projectVarConcept(name);
var.makeBig();
return value;
}
public Object getCachedProjectVar(String name) {
var var = findProjectVar(name);
return var == null ? null : var.cachedValue();
}
public boolean isBigProjectVar(String name) {
var v = findProjectVar(name);
return v != null && v.big();
}
public A setPersistentProjectVar(String name, A value) {
setProjectVar(true, name, value);
return value;
}
public G22Variable setTransientProjectVar(String name, Object value) {
return setProjectVar(false, name, value);
}
public A setTransientProjectVarAndReturn(String name, A value) {
setProjectVar(false, name, value);
return value;
}
public void setAutoClosingProjectVar(String name, Object value) {
setTransientProjectVar(name, value).autoClose(true);
}
public void deleteProjectVar(String name) {
deleteConcept(findProjectVar(name));
}
public Object getOrCreateProjectVar(String name, IF0 maker) {
return getOrCreateProjectVar(projectVarConcept(name), maker);
}
public Object getOrCreatePersistentProjectVar(String name, IF0 maker) {
var var = projectVarConcept(name);
Object value = getOrCreateProjectVar(var, maker);
var.persistent(true);
return value;
}
public Object getOrCreateProjectVar(G22Variable var, IF0 maker) {
if (!var.has()) {
Object value = maker.get();
if (value != null)
var.setValueIfNull(value);
}
return var.get();
}
public IVarWithNotify liveProjectVar(String name) {
return liveProjectVar(name, null);
}
public IVarWithNotify liveProjectVar(String name, Object defaultValue) {
G22Variable var = projectVarConcept(name);
var.persistent(true);
var.setValueIfNull(defaultValue);
return var.varValue();
}
public IVarWithNotify liveTransientProjectVar(String name) {
return liveTransientProjectVar(name, null);
}
public IVarWithNotify liveTransientProjectVar(String name, Object defaultValue) {
G22Variable var = projectVarConcept(name);
var.persistent(false);
var.setValueIfNull(defaultValue);
return var.varValue();
}
public void replaceCloseableProjectVar(String name, IF0 extends AutoCloseable> calc) {
Object value = getProjectVar(name);
if (value instanceof AutoCloseable) {
main.close((AutoCloseable) value);
deleteProjectVar(name);
}
setTransientProjectVar(name, calc == null ? null : calc.get());
}
public void projectVarChanged(String name) {
var var = findProjectVar(name);
{
if (var != null)
var.changeInsideOfValue();
}
}
public Collection projectVarChanged(Object value) {
var vars = conceptsWhere(concepts, G22Variable.class, "value", value);
for (var var : vars) var.change();
return vars;
}
public double defaultScriptTimeout() {
return 10.0;
}
public double projectWideScriptTimeout() {
return or(toDoubleOrNull(getProjectVar("!Script Timeout")), defaultScriptTimeout());
}
public G22Analyzer getAnalyzer(long id) {
var a = getConcept(concepts, G22Analyzer.class, id);
if (a == null)
throw fail("Analyzer not found: " + id);
return a;
}
public G22LeftArrowScript getScript(long id) {
var a = getConcept(concepts, G22LeftArrowScript.class, id);
if (a == null)
throw fail("Script not found: " + id);
return a;
}
public Object callScript(long id) {
var script = getScript(id);
return script.evaluateWithoutTimeout();
}
public Object callAutoRunnableScript(long id) {
var script = getScript(id);
return script.evaluateAutoRunWithoutTimeout();
}
public double defaultTimeout() {
return infinity();
}
public A evalRegisteredCode(String processName, IF0 code) {
return evalRegisteredCode(defaultTimeout(), processName, code);
}
public A evalRegisteredCode(double timeoutSeconds, String processName, IF0 code) {
if (code == null)
return null;
return evalWithTimeoutOrTypedException(timeoutSeconds, () -> useThisThreadAsBackgroundProcess(processName, code));
}
public void startAsRegisteredThread(String processName, Runnable r) {
if (r == null)
return;
startThread(processName, () -> useThisThreadAsBackgroundProcess(processName, toIF0(r)));
}
public A useThisThreadAsBackgroundProcess(String processName, IF0 code) {
AutoCloseable __6 = enter();
try {
var process = backgroundProcessesUI.tempAdd(processName);
try {
Thread myThread = currentThread();
process.setInterruptAction(new Runnable() {
public void run() {
try {
cancelThread(myThread);
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "cancelThread(myThread)";
}
});
return code.get();
} finally {
_close(process);
}
} finally {
_close(__6);
}
}
public Object host() {
AutoCloseable __7 = enter();
try {
return dm_os();
} finally {
_close(__7);
}
}
public A timeFunction(String name, IF0 f) {
return functionTimings.get(name, f);
}
public boolean isConceptsDir(File dir) {
return isSameFile(conceptsDir(concepts), dir);
}
synchronized public FileWatchService fileWatcher() {
{
if (fileWatcher == null)
fileWatcher = new FileWatchService();
return fileWatcher;
}
}
synchronized public G22Utils onProjectFileChanged(IVF1 listener) {
super.onProjectFileChanged(listener);
if (!projectFileListenerInitiated) {
projectFileListenerInitiated = true;
fileWatcher().addRecursiveListener(dbDir(), __8 -> projectFileChanged(__8));
}
return this;
}
public G22ProjectInfo projectInfo_cache;
public G22ProjectInfo projectInfo() {
if (projectInfo_cache == null)
projectInfo_cache = projectInfo_load();
return projectInfo_cache;
}
public G22ProjectInfo projectInfo_load() {
return optimizedUniq(concepts, G22ProjectInfo.class);
}
public RunnablesReferenceQueue runnablesReferenceQueue() {
return masterStuff.runnablesReferenceQueue();
}
public EphemeralObjectIDs ephemeralObjectIDs() {
return masterStuff.ephemeralObjectIDs();
}
public Object eph(long id) {
return ephemeralObjectIDs().get(id);
}
public void openInBrowser(String url) {
if (Desktop.getDesktop().isSupported(Desktop.Action.BROWSE))
main.openInBrowser(url);
else {
String cmd;
if (projectInfo().useFirefox() && isOnPATH("firefox"))
cmd = "firefox";
else {
cmd = chromeCmd();
if (isRoot())
cmd += " -no-sandbox";
}
cmd += " " + platformQuote(url);
nohup(cmd);
}
}
public String compilationDate() {
return or2(compilationDateFromClassPath(this), "unknown");
}
public String projectID() {
return projectInfo().projectID();
}
public IG22LoadedDB getLoadedDB() {
return masterStuff.getLoadedDB(concepts);
}
public ConceptsComboBox galleryImagesComboBox() {
return swing(() -> new ConceptsComboBox(concepts, G22GalleryImage.class));
}
public IBackgroundProcess tempAddBackgroundProcess(String name) {
return backgroundProcessesUI == null ? null : backgroundProcessesUI.tempAdd(name);
}
public IF1 classFinder() {
return masterStuff.makeClassFinder();
}
public Object restructure(Object o) {
return unstructure(structure(o), false, concepts.classFinder);
}
public G22ProjectActions project() {
return projectActions();
}
public boolean openPathInProject(String path) {
return projectActions().openPathInProject(path);
}
final public boolean showUIURL(String url) {
return openUIURL(url);
}
public boolean openUIURL(String url) {
return projectActions().openUIURL(url);
}
public BufferedImage loadProjectImage(String fileName) {
return loadImage2(projectFile(fileName));
}
public IG22LoadedDB openDB(String name) {
return openDB(name, false);
}
public IG22LoadedDB openDB(String name, boolean hidden) {
return masterStuff().openDB(name, hidden);
}
public G22Utils getProject(String name) {
return openDB(name, true).g22utils();
}
public G22JavaObjectVisualizer visualizeObject(Object o) {
return new G22JavaObjectVisualizer(this, o);
}
transient public IF0 makeVariablesPanel;
public G22VariablesPanel makeVariablesPanel() {
return makeVariablesPanel != null ? makeVariablesPanel.get() : makeVariablesPanel_base();
}
final public G22VariablesPanel makeVariablesPanel_fallback(IF0 _f) {
return _f != null ? _f.get() : makeVariablesPanel_base();
}
public G22VariablesPanel makeVariablesPanel_base() {
return new G22VariablesPanel().g22utils(this);
}
transient public IF0 jGazelleLogo;
public JComponent jGazelleLogo() {
return jGazelleLogo != null ? jGazelleLogo.get() : jGazelleLogo_base();
}
final public JComponent jGazelleLogo_fallback(IF0 _f) {
return _f != null ? _f.get() : jGazelleLogo_base();
}
public JComponent jGazelleLogo_base() {
return main.jGazelleLogo();
}
public boolean devMode() {
return masterStuff().devMode();
}
public List list(Class type) {
return list(type, concepts());
}
public List list(Class type, Concepts cc) {
return main.list(cc, type);
}
public List list(Concepts concepts, Class type) {
return main.list(type, concepts);
}
public G22GalleryImage galleryImageForMD5(String md5) {
return firstThat(list(concepts, G22GalleryImage.class), img -> cic(fileName(img.path), md5));
}
public JComponent wrapImageSurface(ImageSurface is) {
return is == null ? null : jscroll_centered_borderless(is);
}
public JComponent wrap(Object o) {
var c = main.wrap(o);
if (c instanceof ImageSurface)
return wrapImageSurface((ImageSurface) c);
return c;
}
transient public IF0 byUser;
public String byUser() {
return byUser != null ? byUser.get() : byUser_base();
}
final public String byUser_fallback(IF0 _f) {
return _f != null ? _f.get() : byUser_base();
}
public String byUser_base() {
return "";
}
final public Collection extends IG22LoadedDB> openProjects() {
return getLoadedDBs();
}
public Collection extends IG22LoadedDB> getLoadedDBs() {
return masterStuff().openProjects();
}
public List listInOpenProjects(Class type) {
return concatMap(openProjects(), db -> db.g22utils().list(type));
}
transient public PicturesByMD5 picturesByMD5_cache;
public PicturesByMD5 picturesByMD5() {
if (picturesByMD5_cache == null)
picturesByMD5_cache = picturesByMD5_load();
return picturesByMD5_cache;
}
public PicturesByMD5 picturesByMD5_load() {
return new PicturesByMD5(projectFile("Images")).extension(".qoi");
}
public JButton reloadButton(String toolTip, Runnable action) {
return jimageButton("#1101440", toolTip, action);
}
public void registerConcept(Concept c) {
main.registerConcept(concepts, c);
}
public void registerConcept(Concepts cc, Concept c) {
main.registerConcept(cc, c);
}
public void addingAdditionalAutoCompletes(LeftArrowScriptAutoCompleter autoCompleter) {
String token = autoCompleter.prevToken();
if (isIdentifier(token) && contains(token, "ProjectVar"))
autoCompleter.addToSearcher(quoteAll(projectVarNames()));
}
public boolean addLibrary(String library) {
if (!main.addLibrary(library))
return false;
print("Loaded library: " + library);
masterStuff().newClassesDefined();
return true;
}
public boolean addLibrary(File library) {
if (!main.addLibrary(library))
return false;
print("Loaded library: " + library);
masterStuff().newClassesDefined();
return true;
}
public WrappedCloseable addResource(A resource) {
if (resource == null)
return null;
autoClosingResources.add(resource);
return new WrappedCloseable<>(resource) {
@Override
public void beforeClose() {
autoClosingResources.remove(resource);
}
};
}
public Object callFunctionFromScript(int scriptID, String functionName, Object... args) {
return callFunctionFromScript((long) scriptID, functionName, args);
}
public Object callFunctionFromScript(long scriptID, String functionName, Object... args) {
var function = getScript(scriptID).safestCompileResult().get().getFunction(functionName);
return function.call(new FlexibleVarContext(), args);
}
}
static abstract public class IterableIterator implements Iterator , Iterable {
public Iterator iterator() {
return this;
}
public void remove() {
unsupportedOperation();
}
}
static public class RemoteDB implements AutoCloseable {
public DialogIO db;
public String name;
public RemoteDB(String s) {
this(s, false);
}
public RemoteDB(String s, boolean autoStart) {
name = s;
if (isSnippetID(s))
name = dbBotName(s);
db = findBot(name);
if (db == null)
if (autoStart) {
nohupJavax(fsI(s));
waitForBotStartUp(name);
assertNotNull("Weird problem", db = findBot(s));
} else
throw fail("DB " + s + " not running");
}
public boolean functional() {
return db != null;
}
public List list() {
return adopt((List) rpc(db, "xlist"));
}
public List list(String className) {
return adopt((List) rpc(db, "xlist", className));
}
public List xlist() {
return list();
}
public List xlist(String className) {
return list(className);
}
public List adopt(List l) {
if (l != null)
for (RC rc : l) adopt(rc);
return l;
}
public RC adopt(RC rc) {
if (rc != null)
rc.db = this;
return rc;
}
public Object adopt(Object o) {
if (o instanceof RC)
return adopt((RC) o);
return o;
}
public String xclass(RC o) {
return (String) rpc(db, "xclass", o);
}
public Object xget(RC o, String field) {
return adopt(rpc(db, "xget", o, field));
}
public String xS(RC o, String field) {
return (String) xget(o, field);
}
public RC xgetref(RC o, String field) {
return adopt((RC) xget(o, field));
}
public void xset(RC o, String field, Object value) {
rpc(db, "xset", o, field, value);
}
public RC uniq(String className) {
RC ref = first(list(className));
if (ref == null)
ref = xnew(className);
return ref;
}
public RC xuniq(String className) {
return uniq(className);
}
public RC xnew(String className, Object... values) {
return adopt((RC) rpc(db, "xnew", className, values));
}
public void xdelete(RC o) {
rpc(db, "xdelete", o);
}
public void xdelete(List l) {
rpc(db, "xdelete", l);
}
public void close() {
_close(db);
}
public String fullgrab() {
return (String) rpc(db, "xfullgrab");
}
public String xfullgrab() {
return fullgrab();
}
public void xshutdown() {
rpc(db, "xshutdown");
}
public long xchangeCount() {
return (long) rpc(db, "xchangeCount");
}
public int xcount() {
return (int) rpc(db, "xcount");
}
public void reconnect() {
close();
db = findBot(name);
}
public RC rc(long id) {
return new RC(this, id);
}
}
static public class Flag implements Runnable {
volatile public boolean up = false;
public boolean raise() {
if (up)
return false;
synchronized (this) {
if (up)
return false;
up = true;
notifyAll();
return true;
}
}
public void run() {
try {
raise();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public void waitUntilUp() {
try {
if (up)
return;
synchronized (this) {
while (!up) wait();
}
} catch (Exception __e) {
throw rethrow(__e);
}
}
public boolean waitUntilUp(double timeout) {
if (timeout == infinity()) {
waitUntilUp();
return isUp();
} else
return waitUntilUp(toMS(timeout));
}
public boolean waitUntilUp(long timeout) {
try {
if (up)
return true;
synchronized (this) {
if (!up)
wait(timeout);
}
return isUp();
} catch (Exception __e) {
throw rethrow(__e);
}
}
final public boolean get() {
return isUp();
}
public boolean isUp() {
return up;
}
public String toString() {
return isUp() ? "up" : "down";
}
}
public interface ChangeTriggerable {
public void change();
}
public static interface IF0 {
public A get();
}
static public interface IFieldsToList {
public Object[] _fieldsToList();
}
static public class WeakValueMap implements AutoCloseable, IntSize {
transient public Set> onValueForKeyReleased;
public WeakValueMap onValueForKeyReleased(IVF1 f) {
onValueForKeyReleased = createOrAddToSyncLinkedHashSet(onValueForKeyReleased, f);
return this;
}
public WeakValueMap removeValueForKeyReleasedListener(IVF1 f) {
main.remove(onValueForKeyReleased, f);
return this;
}
public void valueForKeyReleased(A key) {
if (onValueForKeyReleased != null)
for (var listener : onValueForKeyReleased) pcallF_typed(listener, key);
}
public Map > map = syncMap();
public RunnablesReferenceQueue queue;
public boolean myQueue = true;
public WeakValueMap() {
}
public WeakValueMap(RunnablesReferenceQueue queue) {
this.queue = queue;
myQueue = false;
}
public class MyRef extends WeakReference implements Runnable {
public A key;
public MyRef(A key, B value) {
super(value, queue().get());
this.key = key;
}
public void run() {
try {
boolean current = syncMapRemoveKeyAndValuePair(map, key, this);
valueForKeyReleased(key);
} catch (Exception __e) {
throw rethrow(__e);
}
}
}
public B get(A key) {
return getWeakRef(map.get(key));
}
public B put(A key, B value) {
synchronized (mutex()) {
if (value == null) {
B old = getWeakRef(map.get(key));
map.remove(key);
return old;
} else
return getWeakRef(map.put(key, new MyRef(key, value)));
}
}
public Object mutex() {
return collectionMutex(map);
}
public RunnablesReferenceQueue queue() {
synchronized (mutex()) {
if (queue == null)
queue = new RunnablesReferenceQueue();
return queue;
}
}
public void close() {
try {
if (myQueue)
synchronized (mutex()) {
{
cleanUp(queue);
queue = null;
}
}
} catch (Exception __e) {
throw rethrow(__e);
}
}
public int size() {
return map.size();
}
public Map snapshot() {
synchronized (mutex()) {
Map snapshot = new HashMap();
for (var __0 : _entrySet(map)) {
var key = __0.getKey();
var ref = __0.getValue();
mapPut(snapshot, key, getWeakRef(ref));
}
return snapshot;
}
}
final public void queue(RunnablesReferenceQueue queue) {
setQueue(queue);
}
public void setQueue(RunnablesReferenceQueue queue) {
synchronized (mutex()) {
if (queue == null || this.queue == queue)
return;
if (this.queue != null)
throw fail("Can't change queue once we're started");
this.queue = queue;
myQueue = false;
}
}
}
static public interface IVF1 {
public void get(A a);
}
static public class MultiSet implements IMultiSet {
public Map map = new HashMap();
public int size;
public MultiSet(boolean useTreeMap) {
if (useTreeMap)
map = new TreeMap();
}
public MultiSet(TreeMap map) {
this.map = map;
}
public MultiSet() {
}
public MultiSet(Iterable c) {
addAll(c);
}
public MultiSet(MultiSet ms) {
synchronized (ms) {
for (A a : ms.keySet()) add(a, ms.get(a));
}
}
public synchronized int add(A key) {
return add(key, 1);
}
synchronized public void addAll(Iterable c) {
if (c != null)
for (A a : c) add(a);
}
synchronized public void addAll(MultiSet ms) {
for (A a : ms.keySet()) add(a, ms.get(a));
}
synchronized public int add(A key, int count) {
if (count <= 0)
return 0;
size += count;
Integer i = map.get(key);
map.put(key, i != null ? (count += i) : count);
return count;
}
synchronized public void put(A key, int count) {
int oldCount = get(key);
if (count == oldCount)
return;
size += count - oldCount;
if (count != 0)
map.put(key, count);
else
map.remove(key);
}
public synchronized int get(A key) {
Integer i = map.get(key);
return i != null ? i : 0;
}
synchronized public boolean contains(A key) {
return map.containsKey(key);
}
synchronized public void remove(A key) {
Integer i = map.get(key);
if (i != null) {
--size;
if (i > 1)
map.put(key, i - 1);
else
map.remove(key);
}
}
synchronized public List topTen() {
return getTopTen();
}
synchronized public List getTopTen() {
return getTopTen(10);
}
synchronized public List getTopTen(int maxSize) {
List list = getSortedListDescending();
return list.size() > maxSize ? list.subList(0, maxSize) : list;
}
synchronized public List highestFirst() {
return getSortedListDescending();
}
synchronized public List lowestFirst() {
return reversedList(getSortedListDescending());
}
synchronized public List getSortedListDescending() {
List list = new ArrayList (map.keySet());
Collections.sort(list, new Comparator () {
public int compare(A a, A b) {
return map.get(b).compareTo(map.get(a));
}
});
return list;
}
synchronized public int getNumberOfUniqueElements() {
return map.size();
}
synchronized public int uniqueSize() {
return map.size();
}
synchronized public Set asSet() {
return map.keySet();
}
synchronized public NavigableSet navigableSet() {
return navigableKeys((NavigableMap) map);
}
synchronized public Set keySet() {
return map.keySet();
}
final public A mostPopular() {
return getMostPopularEntry();
}
synchronized public A getMostPopularEntry() {
int max = 0;
A a = null;
for (Map.Entry entry : map.entrySet()) {
if (entry.getValue() > max) {
max = entry.getValue();
a = entry.getKey();
}
}
return a;
}
synchronized public void removeAll(A key) {
size -= get(key);
map.remove(key);
}
synchronized public int size() {
return size;
}
synchronized public MultiSet mergeWith(MultiSet set) {
MultiSet result = new MultiSet ();
for (A a : set.asSet()) {
result.add(a, set.get(a));
}
return result;
}
synchronized public boolean isEmpty() {
return map.isEmpty();
}
synchronized public String toString() {
return str(map);
}
synchronized public void clear() {
map.clear();
size = 0;
}
final public Map toMap() {
return asMap();
}
synchronized public Map asMap() {
return cloneMap(map);
}
}
static public class Pair implements Comparable> {
final public Pair setA(A a) {
return a(a);
}
public Pair a(A a) {
this.a = a;
return this;
}
final public A getA() {
return a();
}
public A a() {
return a;
}
public A a;
final public Pair setB(B b) {
return b(b);
}
public Pair b(B b) {
this.b = b;
return this;
}
final public B getB() {
return b();
}
public B b() {
return b;
}
public B b;
public Pair() {
}
public Pair(A a, B b) {
this.b = b;
this.a = a;
}
public int hashCode() {
return hashCodeFor(a) + 2 * hashCodeFor(b);
}
public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof Pair))
return false;
Pair t = (Pair) o;
return eq(a, t.a) && eq(b, t.b);
}
public String toString() {
return "<" + a + ", " + b + ">";
}
public int compareTo(Pair p) {
if (p == null)
return 1;
int i = ((Comparable ) a).compareTo(p.a);
if (i != 0)
return i;
return ((Comparable) b).compareTo(p.b);
}
}
public interface IVarWithNotify extends IVar , IF0WithChangeListeners {
default public IVarWithNotify onChange(IVF1 r) {
if (r == null)
return this;
onChange(() -> r.get(get()));
return this;
}
default public IVarWithNotify onChangeAndNow(IVF1 r) {
if (r == null)
return this;
onChangeAndNow(() -> r.get(get()));
return this;
}
}
public interface Enterable {
public AutoCloseable enter();
}
static public class FlexibleVarContext extends VarContext {
public Map vars;
public FlexibleVarContext() {
}
public FlexibleVarContext(VarContext parent) {
super(parent);
}
public Object get(String name) {
if (containsKey(vars, name))
return mapGet(vars, name);
if (parent != null)
return parent.get(name);
return null;
}
public void set(String name, Object value) {
vars = putOrCreateSyncMap(vars, name, value);
}
public AutoCloseable tempSet(String name, Object value) {
initMap();
return main.tempPut(vars, name, value);
}
public void unset(String name) {
remove(vars, name);
}
public Map varMap() {
return vars;
}
final public void initMap() {
makeThreadSafe();
}
public void makeThreadSafe() {
if (vars == null)
vars = syncHashMap();
}
}
static public interface IMultiSet {
public int add(A key);
public int get(A key);
}
static public class G22VariablesPanel implements Swingable, IFieldsToList {
public G22VariablesPanel() {
}
public String toString() {
return shortClassName_dropNumberPrefix(this);
}
public Object[] _fieldsToList() {
return null;
}
final public G22VariablesPanel setG22utils(G22Utils g22utils) {
return g22utils(g22utils);
}
public G22VariablesPanel g22utils(G22Utils g22utils) {
this.g22utils = g22utils;
return this;
}
final public G22Utils getG22utils() {
return g22utils();
}
public G22Utils g22utils() {
return g22utils;
}
public G22Utils g22utils;
final public G22VariablesPanel setCompactView(boolean compactView) {
return compactView(compactView);
}
public G22VariablesPanel compactView(boolean compactView) {
this.compactView = compactView;
return this;
}
final public boolean getCompactView() {
return compactView();
}
public boolean compactView() {
return compactView;
}
public boolean compactView = false;
final public G22VariablesPanel setUpdateInterval(double updateInterval) {
return updateInterval(updateInterval);
}
public G22VariablesPanel updateInterval(double updateInterval) {
this.updateInterval = updateInterval;
return this;
}
final public double getUpdateInterval() {
return updateInterval();
}
public double updateInterval() {
return updateInterval;
}
public double updateInterval = 1.0;
transient public SimpleCRUD_v2 crud;
transient public SingleComponentPanel scpDetail;
transient public ReliableSingleThread rstUpdateDetail = rst(() -> _updateDetail());
public SimpleCRUD_v2 crud() {
if (crud == null) {
crud = new SimpleCRUD_v2<>(g22utils.concepts(), G22Variable.class);
crud.updateInterval(updateInterval);
}
return crud;
}
public transient JComponent visualize_cache;
public JComponent visualize() {
if (visualize_cache == null)
visualize_cache = visualize_load();
return visualize_cache;
}
public JComponent visualize_load() {
return markVisualizer(this, visualize_impl());
}
public JComponent visualize_impl() {
crud().iconButtons(true);
crud.entityName = () -> "Variable";
crud.renderValue = __1 -> strOrNull(__1);
var vis = jCenteredSection("Project Variables", crud.visualize());
if (compactView)
return vis;
crud.onSingleSelectionChanged(() -> {
print("Selection: " + crud.selected());
rstUpdateDetail.get();
});
scpDetail = scp();
return jvsplit(vis, scpDetail);
}
public void updateCount() {
crud().update();
}
public void setSelected(G22Variable var) {
crud().setSelected(var);
}
public void _updateDetail() {
var var = crud.selected();
if (var == null) {
scpDetail.clear();
return;
}
Object value = var.value();
var vis = new G22JavaObjectVisualizer(g22utils, value).visualize();
bindChangeListenerToComponent(vis, var.varValue(), () -> {
if (!eq(var.value(), value))
rstUpdateDetail.get();
});
scpDetail.set(jCenteredSection("Variable " + var.name, vis));
}
}
static public class ClassNameResolver {
final public ClassNameResolver setByteCodePath(File byteCodePath) {
return byteCodePath(byteCodePath);
}
public ClassNameResolver byteCodePath(File byteCodePath) {
this.byteCodePath = byteCodePath;
return this;
}
final public File getByteCodePath() {
return byteCodePath();
}
public File byteCodePath() {
return byteCodePath;
}
public File byteCodePath = byteCodePathForClass(getClass());
public List importedPackages = itemPlusList("java.lang", endingWith_dropSuffix(standardImports(), ".*"));
public Set allFullyQualifiedClassNames_cache;
public Set allFullyQualifiedClassNames() {
if (allFullyQualifiedClassNames_cache == null)
allFullyQualifiedClassNames_cache = allFullyQualifiedClassNames_load();
return allFullyQualifiedClassNames_cache;
}
public Set allFullyQualifiedClassNames_load() {
Set set = new HashSet();
assertNotNull(byteCodePath);
set.addAll(classNamesInJarOrDir(byteCodePath));
printVars("ClassNameResolver", "byteCodePath", byteCodePath, "classesFound", l(set));
set.addAll(classNamesInLoadedJigsawModules());
return set;
}
public ClassNameResolver init() {
allFullyQualifiedClassNames();
return this;
}
public String findClass(String name) {
for (String pkg : importedPackages) {
String fullName = pkg + "." + name;
if (allFullyQualifiedClassNames().contains(fullName))
return fullName;
}
return null;
}
public void printMe() {
printVars("ClassNameResolver", "byteCodePath", byteCodePath);
print("importedPackages", importedPackages);
}
}
static public class G22GalleryImage extends ConceptWithChangeListeners {
public transient FieldVar varPath_cache;
public FieldVar varPath() {
if (varPath_cache == null)
varPath_cache = varPath_load();
return varPath_cache;
}
public FieldVar varPath_load() {
return new FieldVar(this, "path", () -> path(), path -> path(path));
}
final public G22GalleryImage setPath(File path) {
return path(path);
}
public G22GalleryImage path(File path) {
if (!eq(this.path, path)) {
this.path = path;
change();
}
return this;
}
final public File getPath() {
return path();
}
public File path() {
return path;
}
public File path;
public String toString() {
return fileName(path);
}
public boolean imageExists() {
return fileExists(path);
}
final public BufferedImage image() {
return load();
}
final public BufferedImage getImage() {
return load();
}
public BufferedImage load() {
return loadImage2(path);
}
public File imageFile() {
return path;
}
}
static public class G22ProjectInfo extends Concept {
static final public String _fieldOrder = "projectID projectDir defaultMaskSize historicalProjectDirs useFirefox";
final public String getProjectID() {
return projectID();
}
public String projectID() {
return projectID;
}
public String projectID = aGlobalID();
public File projectDir;
final public G22MaskSize getDefaultMaskSize() {
return defaultMaskSize();
}
public G22MaskSize defaultMaskSize() {
return defaultMaskSize;
}
public G22MaskSize defaultMaskSize = new G22MaskSize();
public List historicalProjectDirs = new ArrayList();
final public boolean getUseFirefox() {
return useFirefox();
}
public boolean useFirefox() {
return useFirefox;
}
public boolean useFirefox = false;
public void addHistoricalProjectDir(File dir) {
if (syncSetAdd(historicalProjectDirs, dir))
change();
}
}
public interface G22ProjectActions {
public void openObjectInProject(long id);
public boolean openPathInProject(String path);
public void editProjectStory();
public void editScripts();
public void editScript(G22LeftArrowScript script);
public boolean openUIURL(String url);
public IVarWithNotify varShowCasedScript();
public G22DatabasesPanel databasesPanel();
}
static public class ImageSurface extends Surface {
public BufferedImage image;
public double zoomX = 1, zoomY = 1, zoomFactor = 1.5;
public Rectangle selection;
public List tools = new ArrayList();
public Object overlay;
public List overlays = syncL();
public Runnable onSelectionChange;
final public ImageSurface setVerbose(boolean verbose) {
return verbose(verbose);
}
public ImageSurface verbose(boolean verbose) {
this.verbose = verbose;
return this;
}
final public boolean getVerbose() {
return verbose();
}
public boolean verbose() {
return verbose;
}
public boolean verbose = false;
public boolean noMinimumSize = true;
public String titleForUpload;
public Object onZoom;
public boolean specialPurposed = false;
final public ImageSurface setAllowPaste(boolean allowPaste) {
return allowPaste(allowPaste);
}
public ImageSurface allowPaste(boolean allowPaste) {
this.allowPaste = allowPaste;
return this;
}
final public boolean getAllowPaste() {
return allowPaste();
}
public boolean allowPaste() {
return allowPaste;
}
public boolean allowPaste = false;
final public ImageSurface setZoomable(boolean zoomable) {
return zoomable(zoomable);
}
public ImageSurface zoomable(boolean zoomable) {
this.zoomable = zoomable;
return this;
}
final public boolean getZoomable() {
return zoomable();
}
public boolean zoomable() {
return zoomable;
}
public boolean zoomable = true;
public boolean noAlpha = false;
public Object interpolationMode = RenderingHints.VALUE_INTERPOLATION_BILINEAR;
public Object onNewImage;
public BufferedImage imageToDraw;
public File file;
public boolean autoZoomToDisplay = false;
final public ImageSurface setRepaintInThread(boolean repaintInThread) {
return repaintInThread(repaintInThread);
}
public ImageSurface repaintInThread(boolean repaintInThread) {
this.repaintInThread = repaintInThread;
return this;
}
final public boolean getRepaintInThread() {
return repaintInThread();
}
public boolean repaintInThread() {
return repaintInThread;
}
public boolean repaintInThread = false;
public BoolVar showingVar;
public Pt mousePosition;
transient public Set onMousePositionChanged;
public ImageSurface onMousePositionChanged(Runnable r) {
onMousePositionChanged = createOrAddToSyncLinkedHashSet(onMousePositionChanged, r);
return this;
}
public ImageSurface removeMousePositionChangedListener(Runnable r) {
main.remove(onMousePositionChanged, r);
return this;
}
public void mousePositionChanged() {
if (onMousePositionChanged != null)
for (var listener : onMousePositionChanged) pcallF_typed(listener);
}
transient public Set onImageChanged;
public ImageSurface onImageChanged(Runnable r) {
onImageChanged = createOrAddToSyncLinkedHashSet(onImageChanged, r);
return this;
}
public ImageSurface removeImageChangedListener(Runnable r) {
main.remove(onImageChanged, r);
return this;
}
public void imageChanged() {
if (onImageChanged != null)
for (var listener : onImageChanged) pcallF_typed(listener);
}
transient public Set> onUserModifiedImage;
public ImageSurface onUserModifiedImage(IVF1 f) {
onUserModifiedImage = createOrAddToSyncLinkedHashSet(onUserModifiedImage, f);
return this;
}
public ImageSurface removeUserModifiedImageListener(IVF1 f) {
main.remove(onUserModifiedImage, f);
return this;
}
public void userModifiedImage(BufferedImage image) {
if (onUserModifiedImage != null)
for (var listener : onUserModifiedImage) pcallF_typed(listener, image);
}
public ImageSurface() {
this(dummyImage());
}
static public BufferedImage dummyImage() {
return whiteImage(1);
}
public ImageSurface(File file) {
setImage(file);
}
public ImageSurface(MakesBufferedImage image) {
this(image != null ? image.getBufferedImage() : dummyImage());
}
public ImageSurface(BufferedImage image) {
setImage(image);
clearSurface = false;
bindToComponent(this, () -> performAutoZoom(), null);
onResize(this, () -> performAutoZoom());
onEnclosingScrollPaneResize(this, () -> performAutoZoom());
componentPopupMenu2(this, ImageSurface_popupMenuMaker());
new ImageSurfaceSelector(this);
jHandleFileDrop(this, new VF1() {
public void get(File f) {
try {
setImage(loadBufferedImage(f));
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "setImage(loadBufferedImage(f))";
}
});
imageSurfaceOnHover(this, p -> {
mousePosition = p;
mousePositionChanged();
});
}
public ImageSurface(RGBImage image, double zoom) {
this(image);
setZoom(zoom);
}
public void fillPopupMenu(JPopupMenu menu, final Point point) {
if (zoomable) {
JMenuItem miZoomReset = new JMenuItem("Zoom 100%");
miZoomReset.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
setZoom(1.0);
centerPoint(point);
}
});
menu.add(miZoomReset);
JMenuItem miZoomIn = new JMenuItem("Zoom in");
miZoomIn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
zoomIn(zoomFactor);
centerPoint(point);
}
});
menu.add(miZoomIn);
JMenuItem miZoomOut = new JMenuItem("Zoom out");
miZoomOut.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
zoomOut(zoomFactor);
centerPoint(point);
}
});
menu.add(miZoomOut);
menu.add(jMenuItemStayCheckedOnClick("Zoom to window", () -> autoZoomToDisplay, () -> setAutoZoomToDisplay(true)));
addMenuItem(menu, "Show full screen", new Runnable() {
public void run() {
try {
showFullScreen();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "showFullScreen()";
}
});
addMenuItem(menu, "Point: " + point.x + "," + point.y + " (image: " + w() + "*" + h() + ")", null);
menu.addSeparator();
}
if (!specialPurposed)
addMenuItem(menu, "Load image...", new Runnable() {
public void run() {
try {
selectFile("Load image", new VF1() {
public void get(File f) {
try {
setImage(loadImage2(f));
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "setImage(loadImage2(f))";
}
});
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "selectFile(\"Load image\",\r\n new VF1() { public void get(File f) c...";
}
});
addMenuItem(menu, "Save image...", new Runnable() {
public void run() {
try {
saveImage();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "saveImage()";
}
});
addMenuItem(menu, "Copy image to clipboard", new Runnable() {
public void run() {
try {
copyImageToClipboard(getImage());
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "copyImageToClipboard(getImage())";
}
});
if (!specialPurposed || allowPaste)
addMenuItem(menu, "Paste image from clipboard", new Runnable() {
public void run() {
try {
loadFromClipboard();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "loadFromClipboard()";
}
});
if (!specialPurposed)
addMenuItem(menu, "Load image snippet...", new Runnable() {
public void run() {
try {
selectImageSnippet(new VF1() {
public void get(String imageID) {
try {
setImage(loadImage2(imageID));
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "setImage(loadImage2(imageID))";
}
});
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "selectImageSnippet(new VF1() { public void get(String imageID) ctex {...";
}
});
if (selection != null)
addMenuItem(menu, "Crop", new Runnable() {
public void run() {
try {
crop();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "crop()";
}
});
if (!specialPurposed)
addMenuItem(menu, "No image", new Runnable() {
public void run() {
try {
noImage();
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "noImage()";
}
});
}
public void noImage() {
setImage((BufferedImage) null);
}
public void crop() {
if (selection == null)
return;
BufferedImage img = cloneClipBufferedImage(getImage(), selection);
selection = null;
setUserModifiedImage(img);
}
public void setUserModifiedImage(BufferedImage img) {
setImage(img);
userModifiedImage(img);
}
public void loadFromClipboard() {
BufferedImage img = getImageFromClipboard();
if (img != null)
setUserModifiedImage(img);
}
transient public IF0 defaultImageDir;
public File defaultImageDir() {
return defaultImageDir != null ? defaultImageDir.get() : defaultImageDir_base();
}
final public File defaultImageDir_fallback(IF0 _f) {
return _f != null ? _f.get() : defaultImageDir_base();
}
public File defaultImageDir_base() {
return getProgramDir();
}
public void saveImage() {
var image = getImage();
JFileChooser fileChooser = new JFileChooser(defaultImageDir());
if (fileChooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
try {
main.saveImage(image, file = fileChooser.getSelectedFile());
} catch (Throwable e) {
popup(e);
}
}
}
public void drawImageItself(int w, int h, Graphics2D g) {
int iw = getZoomedWidth(), ih = getZoomedHeight();
if (interpolationMode == RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR || zoomX >= 1 || zoomY >= 1) {
g.drawImage(image, 0, 0, iw, ih, null);
} else
g.drawImage(resizeImage(image, iw, ih), 0, 0, null);
}
transient public IVF3 drawBackground;
public void drawBackground(int w, int h, Graphics2D g) {
if (drawBackground != null)
drawBackground.get(w, h, g);
else
drawBackground_base(w, h, g);
}
final public void drawBackground_fallback(IVF3 _f, int w, int h, Graphics2D g) {
if (_f != null)
_f.get(w, h, g);
else
drawBackground_base(w, h, g);
}
public void drawBackground_base(int w, int h, Graphics2D g) {
g.setColor(or(getBackground(), Color.white));
g.fillRect(0, 0, w, h);
}
public void render(int w, int h, Graphics2D g) {
if (verbose)
_print("render");
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, interpolationMode);
drawBackground(w, h, g);
BufferedImage image = or(imageToDraw, this.image);
if (!hasImage())
drawBackground(w, h, g);
else {
boolean alpha = !noAlpha && hasTransparency(image);
if (alpha)
drawBackground(w, h, g);
drawImageItself(w, h, g);
int iw = getZoomedWidth(), ih = getZoomedHeight();
if (!alpha) {
g.fillRect(iw, 0, w - iw, h);
g.fillRect(0, ih, iw, h - ih);
}
}
if (overlay != null) {
if (verbose)
_print("render overlay");
pcallF(overlay, g);
}
for (var overlay : cloneList(overlays)) {
try {
overlay.drawOn(cloneGraphics(g));
} catch (Throwable __e) {
printStackTrace(__e);
}
}
if (selection != null) {
if (verbose)
_print("render selection");
drawSelectionRect(g, selection, Color.green, Color.white);
}
}
public void drawSelectionRect(Graphics2D g, Rectangle selection, Color green, Color white) {
drawSelectionRect(g, selection, green, white, zoomX, zoomY);
}
public void drawSelectionRect(Graphics2D g, Rectangle selection, Color green, Color white, double zoomX, double zoomY) {
g.setColor(green);
int top = (int) (selection.y * zoomY);
int bottom = (int) ((selection.y + selection.height) * zoomY);
int left = (int) (selection.x * zoomX);
int right = (int) ((selection.x + selection.width) * zoomX);
g.drawRect(left - 1, top - 1, right - left + 1, bottom - top + 1);
g.setColor(white);
g.drawRect(left - 2, top - 2, right - left + 3, bottom - top + 3);
}
public ImageSurface setZoom(double zoom) {
setZoom(zoom, zoom);
return this;
}
public void setZoom(double zoomX, double zoomY) {
autoZoomToDisplay = false;
setZoom_dontChangeAutoZoom(zoomX, zoomY);
}
public void setZoom_dontChangeAutoZoom(double zoomX) {
setZoom_dontChangeAutoZoom(zoomX, zoomX);
}
public void setZoom_dontChangeAutoZoom(double zoomX, double zoomY) {
if (this.zoomX == zoomX && this.zoomY == zoomY)
return;
if (verbose)
_print("Setting zoom");
this.zoomX = zoomX;
this.zoomY = zoomY;
revalidateMe();
repaint();
centerPoint(new Point(getImage().getWidth() / 2, getImage().getHeight() / 2));
pcallF(onZoom);
}
public Dimension getMinimumSize() {
if (metaGet("scaffolding") != null)
scaffoldCalled(this, "getMinimumSize");
if (noMinimumSize)
return new Dimension(1, 1);
int w = getZoomedWidth();
int h = getZoomedHeight();
Dimension min = super.getMinimumSize();
return printIfScaffoldingEnabled(this, new Dimension(Math.max(w, min.width), Math.max(h, min.height)));
}
public int getZoomedHeight() {
return (int) (h() * zoomY);
}
public int getZoomedWidth() {
return (int) (w() * zoomX);
}
public boolean isShowing_quick() {
if (showingVar == null) {
swing(() -> {
if (showingVar == null)
showingVar = componentShowingVar(ImageSurface.this);
});
}
return showingVar.get();
}
public void setImageIfShowing_thisThread(MakesBufferedImage image) {
setImageIfShowing_thisThread(toBufferedImage(image));
}
public void setImageIfShowing_thisThread(BufferedImage image) {
if (isShowing_quick())
setImage_thisThread(image);
}
public void setImage(File file) {
setFile(file);
setImage(loadImage2(file));
}
public void setImage(MakesBufferedImage image) {
swing(() -> {
setImage_thisThread(image);
});
}
public void setImage(BufferedImage img) {
swing(() -> {
setImage_thisThread(img);
});
}
public void setImage_thisThread(MakesBufferedImage img) {
setImage_thisThread(toBufferedImage(img));
}
public void setImage_thisThread(BufferedImage img) {
BufferedImage newImage = img != null ? img : dummyImage();
BufferedImage oldImage = image;
image = newImage;
if (verbose)
print("Old image size:" + imageSize(oldImage) + ", new image size: " + imageSize(newImage));
boolean sameSize = imagesHaveSameSize(oldImage, newImage);
if (!sameSize) {
if (verbose)
_print("New image size");
revalidateMe();
}
quickRepaint();
pcallF(onNewImage);
if (!sameSize && autoZoomToDisplay)
zoomToDisplaySize();
imageChanged();
}
public void setImageAndZoomToDisplay(BufferedImage img) {
setImage(img);
zoomToDisplaySize();
}
public BufferedImage getImage() {
return image;
}
public double getZoomX() {
return zoomX;
}
public double getZoomY() {
return zoomY;
}
public Dimension getPreferredSize() {
if (metaGet("scaffolding") != null)
scaffoldCalled(this, "getPreferredSize");
return printIfScaffoldingEnabled(this, new Dimension(getZoomedWidth(), getZoomedHeight()));
}
public JScrollPane makeScrollPane() {
JScrollPane scrollPane = new JScrollPane(this);
scrollPane.getViewport().setScrollMode(JViewport.BACKINGSTORE_SCROLL_MODE);
return scrollPane;
}
public void zoomToWindow() {
zoomToDisplaySize();
}
public void zoomToDisplaySize() {
swing(() -> {
if (!hasImage())
return;
Dimension display = getDisplaySize();
if (display.width == 0 || display.height == 0)
return;
int w = w(), h = h();
double xRatio = (display.width - 5) / (double) w;
double yRatio = (display.height - 5) / (double) h;
if (scaffoldingEnabled(this))
printVars("zoomToDisplaySize", "display", display, "w", w, "h", h, "xRatio", xRatio, "yRatio", yRatio);
setZoom_dontChangeAutoZoom(min(xRatio, yRatio));
revalidateMe();
});
}
private Dimension getDisplaySize() {
if (metaGet("scaffolding") != null)
scaffoldCalled(this, "getDisplaySize");
Container c = getParent();
while (c != null) {
if (c instanceof JScrollPane)
return c.getSize();
c = c.getParent();
}
return getSize();
}
public void setSelection(Rect r) {
setSelection(toRectangle(r));
}
public void setSelection(Rectangle r) {
if (neq(selection, r)) {
selection = r;
pcallF(onSelectionChange);
quickRepaint();
}
}
public Rectangle getSelection() {
return selection;
}
public RGBImage getRGBImage() {
return new RGBImage(getImage());
}
public void centerPoint(Point p) {
JScrollPane sp = enclosingScrollPane(this);
if (sp == null)
return;
p = new Point((int) (p.x * getZoomX()), (int) (p.y * getZoomY()));
final JViewport viewport = sp.getViewport();
Dimension viewSize = viewport.getExtentSize();
int x = max(0, p.x - viewSize.width / 2);
int y = max(0, p.y - viewSize.height / 2);
p = new Point(x, y);
final Point _p = p;
awtLater(new Runnable() {
public void run() {
try {
viewport.setViewPosition(_p);
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "viewport.setViewPosition(_p);";
}
});
}
public Pt pointFromEvent(MouseEvent e) {
return pointFromComponentCoordinates(new Pt(e.getX(), e.getY()));
}
public Pt pointFromComponentCoordinates(Pt p) {
return new Pt((int) (p.x / zoomX), (int) (p.y / zoomY));
}
public Pt pointToComponentCoordinates(double x, double y) {
return new Pt((int) (x * zoomX), (int) (y * zoomY));
}
public void uploadTheImage() {
}
public void showFullScreen() {
showFullScreenImageSurface(getImage());
}
public void zoomIn(double f) {
setZoom(getZoomX() * f, getZoomY() * f);
}
public void zoomOut(double f) {
setZoom(getZoomX() / f, getZoomY() / f);
}
public ImageSurface setFile(File f) {
file = f;
return this;
}
public void setOverlay(IVF1 overlay) {
this.overlay = overlay;
}
public boolean hasImage() {
return image != null;
}
public int w() {
return image.getWidth();
}
public int h() {
return image.getHeight();
}
final public void pixelate(boolean b) {
setPixelated(b);
}
public void setPixelated(boolean b) {
assertTrue(b);
imageSurface_pixelated(this);
}
final public ImageSurface autoZoomToDisplay(boolean b) {
return setAutoZoomToDisplay(b);
}
public ImageSurface setAutoZoomToDisplay(boolean b) {
if (autoZoomToDisplay = b)
zoomToDisplaySize();
return this;
}
public void quickRepaint() {
if (repaintInThread)
paintImmediately(0, 0, getWidth(), getHeight());
else
repaint();
}
public void setTool(ImageSurfaceMouseHandler tool) {
swing(() -> {
removeAllTools();
addTool(tool);
});
}
public boolean hasTool(AutoCloseable tool) {
return swing(() -> tools.contains(tool));
}
public void addTool(ImageSurfaceMouseHandler tool) {
swing(() -> {
if (!tools.contains(tool))
tool.register(this);
});
}
public void removeTool(AutoCloseable tool) {
swing(() -> {
if (tools.contains(tool)) {
close(tool);
tools.remove(tool);
}
});
}
final public void clearTools() {
removeAllTools();
}
public void removeAllTools() {
closeAllAndClear(tools);
}
public void performAutoZoom() {
if (autoZoomToDisplay)
zoomToDisplaySize();
}
public void revalidateMe() {
revalidateIncludingFullCenterContainer(this);
}
public void addOverlay(G2Drawable overlay) {
overlays.add(overlay);
repaint();
}
public void clearOverlays() {
if (nempty(overlays)) {
overlays.clear();
repaint();
}
}
public void setOverlay(G2Drawable overlay) {
clearOverlays();
if (overlay != null)
addOverlay(overlay);
}
public void loadImage(File f) {
setImage(loadImage2(f));
}
public JComponent visualize() {
return jscroll_center_borderless(this);
}
public void standardZoom() {
setZoom(1.0);
}
public A print(A a) {
return print("", a);
}
public A print(String msg, A a) {
return _print(msg, a);
}
}
static public VF2 ImageSurface_popupMenuMaker() {
return new VF2() {
public void get(ImageSurface is, JPopupMenu menu) {
try {
Point p = is.pointFromEvent(componentPopupMenu_mouseEvent.get()).getPoint();
is.fillPopupMenu(menu, p);
} catch (Exception __e) {
throw rethrow(__e);
}
}
public String toString() {
return "Point p = is.pointFromEvent(componentPopupMenu_mouseEvent.get()).getPoint();\r...";
}
};
}
static public class CombinedStringifier implements IStringifier {
public CopyOnWriteArrayList> stringifiers = new CopyOnWriteArrayList();
public IStringifier defaultStringifier = new Stringifier_ToString();
public CombinedStringifier(IPartialStringifier ... stringifiers) {
addAll(this.stringifiers, stringifiers);
}
public String toString(A o) {
for (var stringifier : stringifiers) {
String s = stringifier.toStringOpt(o);
if (s != null)
return s;
}
return defaultStringifier.toString(o);
}
public String toString() {
return formatFunctionCall("CombinedStringifier", listPlus((List) stringifiers, defaultStringifier));
}
}
static public class GazelleV_LeftArrowScriptParser extends SimpleLeftToRightParser {
final public GazelleV_LeftArrowScriptParser setMagicSwitch(boolean magicSwitch) {
return magicSwitch(magicSwitch);
}
public GazelleV_LeftArrowScriptParser magicSwitch(boolean magicSwitch) {
this.magicSwitch = magicSwitch;
return this;
}
final public boolean getMagicSwitch() {
return magicSwitch();
}
public boolean magicSwitch() {
return magicSwitch;
}
public boolean magicSwitch = true;
public ClassNameResolver classNameResolver;
public List functionContainers = new ArrayList();
final public GazelleV_LeftArrowScriptParser setLasClassLoader(ILASClassLoader lasClassLoader) {
return lasClassLoader(lasClassLoader);
}
public GazelleV_LeftArrowScriptParser lasClassLoader(ILASClassLoader lasClassLoader) {
this.lasClassLoader = lasClassLoader;
return this;
}
final public ILASClassLoader getLasClassLoader() {
return lasClassLoader();
}
public ILASClassLoader lasClassLoader() {
return lasClassLoader;
}
public ILASClassLoader lasClassLoader;
final public GazelleV_LeftArrowScriptParser setClassDefPrefix(String classDefPrefix) {
return classDefPrefix(classDefPrefix);
}
public GazelleV_LeftArrowScriptParser classDefPrefix(String classDefPrefix) {
this.classDefPrefix = classDefPrefix;
return this;
}
final public String getClassDefPrefix() {
return classDefPrefix();
}
public String classDefPrefix() {
return classDefPrefix;
}
public String classDefPrefix;
final public GazelleV_LeftArrowScriptParser setOptimize(boolean optimize) {
return optimize(optimize);
}
public GazelleV_LeftArrowScriptParser optimize(boolean optimize) {
this.optimize = optimize;
return this;
}
final public boolean getOptimize() {
return optimize();
}
public boolean optimize() {
return optimize;
}
public boolean optimize = true;
final public GazelleV_LeftArrowScriptParser setUseFixedVarContexts(boolean useFixedVarContexts) {
return useFixedVarContexts(useFixedVarContexts);
}
public GazelleV_LeftArrowScriptParser useFixedVarContexts(boolean useFixedVarContexts) {
this.useFixedVarContexts = useFixedVarContexts;
return this;
}
final public boolean getUseFixedVarContexts() {
return useFixedVarContexts();
}
public boolean useFixedVarContexts() {
return useFixedVarContexts;
}
public boolean useFixedVarContexts = false;
public LASScope scope;
public LinkedHashMap knownVars = new LinkedHashMap();
public List varAccessesToFix = new ArrayList();
public Set closerTokens = litset(";", "}", ")");
public BuildingScript currentReturnableScript;
public BuildingScript currentLoop;
public boolean inParens = false;
public int idCounter;
public Map classDefs = new HashMap();
transient public Set>> onKnownVarsSnapshot;
public GazelleV_LeftArrowScriptParser onKnownVarsSnapshot(IVF1> f) {
onKnownVarsSnapshot = createOrAddToSyncLinkedHashSet(onKnownVarsSnapshot, f);
return this;
}
public GazelleV_LeftArrowScriptParser removeKnownVarsSnapshotListener(IVF1> f) {
main.remove(onKnownVarsSnapshot, f);
return this;
}
public void knownVarsSnapshot(Map knownVars) {
if (onKnownVarsSnapshot != null)
for (var listener : onKnownVarsSnapshot) pcallF_typed(listener, knownVars);
}
transient public Set> onTypeHook;
public GazelleV_LeftArrowScriptParser onTypeHook(IVF1 f) {
onTypeHook = createOrAddToSyncLinkedHashSet(onTypeHook, f);
return this;
}
public GazelleV_LeftArrowScriptParser removeTypeHookListener(IVF1 f) {
main.remove(onTypeHook, f);
return this;
}
public void typeHook(LASValueDescriptor type) {
if (onTypeHook != null)
for (var listener : onTypeHook) pcallF_typed(listener, type);
}
static public class EvaluableWrapper implements IFieldsToList {
public GazelleV_LeftArrowScript.Evaluable expr;
public EvaluableWrapper() {
}
public EvaluableWrapper(GazelleV_LeftArrowScript.Evaluable expr) {
this.expr = expr;
}
public String toString() {
return shortClassName_dropNumberPrefix(this) + "(" + expr + ")";
}
public boolean equals(Object o) {
if (!(o instanceof EvaluableWrapper))
return false;
EvaluableWrapper __15 = (EvaluableWrapper) o;
return eq(expr, __15.expr);
}
public int hashCode() {
int h = 700525824;
h = boostHashCombine(h, _hashCode(expr));
return h;
}
public Object[] _fieldsToList() {
return new Object[] { expr };
}
}
public class BuildingScript {
public int id = ++idCounter;
final public BuildingScript setReturnable(boolean returnable) {
return returnable(returnable);
}
public BuildingScript returnable(boolean returnable) {
this.returnable = returnable;
return this;
}
final public boolean getReturnable() {
return returnable();
}
public boolean returnable() {
return returnable;
}
public boolean returnable = false;
final public BuildingScript setIsLoopBody(boolean isLoopBody) {
return isLoopBody(isLoopBody);
}
public BuildingScript isLoopBody(boolean isLoopBody) {
this.isLoopBody = isLoopBody;
return this;
}
final public boolean getIsLoopBody() {
return isLoopBody();
}
public boolean isLoopBody() {
return isLoopBody;
}
public boolean isLoopBody = false;
public BuildingScript returnableParent, loopParent;
final public BuildingScript setScope(LASScope scope) {
return scope(scope);
}
public BuildingScript scope(LASScope scope) {
this.scope = scope;
return this;
}
final public LASScope getScope() {
return scope();
}
public LASScope scope() {
return scope;
}
public LASScope scope;
public GazelleV_LeftArrowScript.Script script = new GazelleV_LeftArrowScript.Script();
public List steps = new ArrayList();
public Map functionDefs = new HashMap();
public BuildingScript(boolean returnable) {
this();
this.returnable = returnable;
}
public BuildingScript(boolean returnable, boolean isLoopBody) {
this();
this.isLoopBody = isLoopBody;
this.returnable = returnable;
}
public BuildingScript() {
scope = currentScope();
}
public void add(GazelleV_LeftArrowScript.Evaluable step) {
if (step != null)
steps.add(step);
}
public GazelleV_LeftArrowScript.Evaluable get() {
script.scope = scope;
var lastStep = last(steps);
if (lastStep instanceof GazelleV_LeftArrowScript.ReturnFromScript)
if (((GazelleV_LeftArrowScript.ReturnFromScript) lastStep).script == script)
replaceLast(steps, ((GazelleV_LeftArrowScript.ReturnFromScript) lastStep).value);
if (!returnable && l(steps) == 1 && empty(functionDefs))
return first(steps);
if (nempty(functionDefs))
script.functionDefs = functionDefs;
script.steps = toTypedArray(GazelleV_LeftArrowScript.Evaluable.class, steps);
return script;
}
public String toStringLong() {
return pnlToLines(steps);
}
public String toString() {
return formatRecordVars("BuildingScript", "id", id, "returnable", returnable, "returnableParent", returnableParent, "script", script);
}
}
public GazelleV_LeftArrowScript.Script parse(String text) {
setText(text);
init();
return parse();
}
public GazelleV_LeftArrowScript.Script parse() {
GazelleV_LeftArrowScript.Script script = parseReturnableScript();
for (var varAccess : varAccessesToFix) varAccess.resolve();
if (optimize)
script = script.optimizeScript();
return script;
}
public GazelleV_LeftArrowScript.Script parseReturnableScript() {
return (GazelleV_LeftArrowScript.Script) parseScript(new BuildingScript().returnable(true));
}
public GazelleV_LeftArrowScript.Evaluable parseScript(BuildingScript script) {
return linkToSrc(() -> {
script.returnableParent = currentReturnableScript;
script.loopParent = currentLoop;
if (script.returnable)
currentReturnableScript = script;
if (script.isLoopBody)
currentLoop = script;
return parseBuildingScript(script);
});
}
public GazelleV_LeftArrowScript.Evaluable parseBuildingScript(BuildingScript script) {
try {
parseScript_2(script);
var builtScript = script.get();
currentReturnableScript = script.returnableParent;
currentLoop = script.loopParent;
return builtScript;
} catch (Throwable e) {
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("Parsed so far:\n" + script);
throw rethrowAndAppendToMessage(e, squareBracketed(str(lineAndColumn(-1))));
}
}
public void parseScript_2(BuildingScript script) {
AutoCloseable __6 = tempRestoreMap(knownVars);
try {
AssureAdvance assure = new AssureAdvance();
while (assure.get()) {
knownVarsSnapshot(knownVars);
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("parseScript_2: Next token is " + quote(token()));
if (is(";")) {
next();
continue;
}
if (isOneOf("}", ")"))
break;
GazelleV_LeftArrowScript.Evaluable instruction = linkToSrc(() -> parseInstruction(script));
if (instruction != null)
script.add(instruction);
}
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("parseScript_2 done");
knownVarsSnapshot(knownVars);
} finally {
_close(__6);
}
}
public GazelleV_LeftArrowScript.Evaluable parseInstruction(BuildingScript script) {
if (is("def")) {
parseFunctionDefinition(currentReturnableScript.functionDefs);
return null;
}
if (is("param")) {
consume();
String var = assertIdentifier(tpp());
LASValueDescriptor valueDescriptor = new LASValueDescriptor();
if (is(":")) {
var type = parseColonType();
valueDescriptor = LASValueDescriptor.nonExactCanBeNull(type);
}
knownVars.put(var, valueDescriptor);
script.script.params = putOrCreateLinkedHashMap(script.script.params, var, valueDescriptor);
return null;
}
if (is("throw")) {
consume();
return new GazelleV_LeftArrowScript.Throw(parseExpr());
}
if (is("try")) {
consume();
GazelleV_LeftArrowScript.Evaluable body = parseCurlyBlock(new BuildingScript());
while (consumeOpt("catch")) {
String var = consumeIdentifier();
AutoCloseable __7 = tempAddKnownVars(var);
try {
GazelleV_LeftArrowScript.Evaluable catchBlock = parseCurlyBlock(new BuildingScript());
body = new GazelleV_LeftArrowScript.TryCatch(body, var, catchBlock);
} finally {
_close(__7);
}
}
if (consumeOpt("finally")) {
GazelleV_LeftArrowScript.Evaluable finallyBlock = parseCurlyBlock(new BuildingScript());
return new GazelleV_LeftArrowScript.TryFinally(body, finallyBlock);
}
return body;
}
if (isOneOf("return", "ret")) {
consume();
GazelleV_LeftArrowScript.Evaluable expr;
if (atCmdEnd())
expr = _const(null);
else
expr = parseAssignmentOrExpr();
return new GazelleV_LeftArrowScript.ReturnFromScript(currentReturnableScript.script, expr);
}
if (is("continue")) {
consume();
assertCmdEnd();
if (currentLoop == null)
throw fail("continue outside of loop");
return new GazelleV_LeftArrowScript.Continue(currentLoop.script);
}
if (is("temp")) {
consume();
GazelleV_LeftArrowScript.Evaluable tempExpr = parseAssignmentOrExpr();
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("tempExpr", tempExpr);
GazelleV_LeftArrowScript.Evaluable body = parseScript(new BuildingScript());
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("body", body);
return new GazelleV_LeftArrowScript.TempBlock(tempExpr, body);
}
if (is("will") && is(1, "return")) {
consume(2);
GazelleV_LeftArrowScript.Evaluable exp = parseAssignmentOrExpr();
GazelleV_LeftArrowScript.Evaluable body = parseScript(new BuildingScript());
return new GazelleV_LeftArrowScript.WillReturn(exp, body);
}
if (is("class"))
return new GazelleV_LeftArrowScript.ClassDef(new ResolvableLASClass(lasClassLoader, parseClassDef()));
return parseAssignmentOrExpr();
}
public GazelleV_LeftArrowScript.Evaluable parseAssignmentOrExpr() {
{
var __3 = parseAssignmentOpt();
if (__3 != null)
return __3;
}
return parseExpr();
}
public GazelleV_LeftArrowScript.Evaluable parseAssignmentOpt() {
String t = token();
if (isIdentifier(t)) {
Type type = null;
var ptr = ptr();
if (is(1, ":")) {
next();
type = parseColonType();
unconsume();
}
if (is(1, "<") && is(2, "-")) {
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("Found assignment");
next(3);
GazelleV_LeftArrowScript.Evaluable rhs = parseExpr();
assertNotNull("Expression expected", rhs);
boolean newVar = !knownVars.containsKey(t);
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
printVars("newVar", newVar, "t", t, "knownVars", knownVars);
knownVars.put(t, type == null ? new LASValueDescriptor() : LASValueDescriptor.nonExactCanBeNull(type));
return newVar ? new GazelleV_LeftArrowScript.VarDeclaration(t, null, rhs) : new GazelleV_LeftArrowScript.Assignment(t, rhs);
}
ptr(ptr);
}
return null;
}
public GazelleV_LeftArrowScript.Evaluable parseOptionalInnerExpression() {
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
printVars("parseOptionalInnerExpression", "token", token());
if (atCmdEnd() || isOneOf("{", ",", "then"))
return null;
return parseInnerExpr();
}
public GazelleV_LeftArrowScript.Evaluable _const(Object o) {
return new GazelleV_LeftArrowScript.Const(o);
}
public GazelleV_LeftArrowScript.Evaluable parseInnerExpr() {
return parseExpr(true);
}
public GazelleV_LeftArrowScript.Evaluable parseExpr() {
if (metaGet("scaffolding") != null)
scaffoldCalled(this, "parseExpr");
return parseExpr(false);
}
public GazelleV_LeftArrowScript.Evaluable parseExpr(boolean inner) {
GazelleV_LeftArrowScript.Evaluable e = linkToSrc(() -> inner ? parseExpr_impl(true) : parseFullExpr());
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("parseExpr done:\n" + GazelleV_LeftArrowScript.indentedScriptStruct(e));
return e;
}
public GazelleV_LeftArrowScript.Evaluable parseFullExpr() {
return parseExprPlusOptionalComma();
}
public GazelleV_LeftArrowScript.CallOnTarget parseThenCall(GazelleV_LeftArrowScript.CallOnTarget expr) {
consume("then");
GazelleV_LeftArrowScript.CallOnTarget secondCall = (GazelleV_LeftArrowScript.CallOnTarget) (parseCall(null));
return new GazelleV_LeftArrowScript.Then(expr, secondCall);
}
public GazelleV_LeftArrowScript.Evaluable parseExprPlusOptionalComma() {
GazelleV_LeftArrowScript.Evaluable expr = parseExpr_impl(false);
while (consumeOpt(",")) {
expr = parseCall_noCmdEndCheck(expr);
}
return expr;
}
public GazelleV_LeftArrowScript.Evaluable parseExpr_impl(boolean inner) {
if (atEnd())
return null;
String t = token();
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
printVars("parseExpr", "token", t);
if (is(";"))
return null;
if (is("{"))
return parseCurlyBlock(new BuildingScript());
if (is("-") && empty(nextSpace()) && startsWithDigit(token(1)) || startsWithDigit(t)) {
var e = parseNumberLiteral();
return inner ? e : parseCall(e);
}
if (isQuoted(t)) {
var e = parseStringLiteral();
return inner ? e : parseCall(e);
}
if (startsWith(t, '\'')) {
consume();
var e = _const(first(unquote(t)));
return inner ? e : parseCall(e);
}
if (isIdentifier(t)) {
if (is("while"))
return parseWhileLoop();
if (is("for"))
return parseForEach();
if (is("if"))
return parseIfStatement();
if (is("repeat"))
return parseRepeatStatement();
if (is("outer")) {
consume();
var a = parseAssignmentOpt();
if (!(a instanceof GazelleV_LeftArrowScript.Assignment))
throw fail("Assignment expected");
return new GazelleV_LeftArrowScript.AssignmentToOuterVar(((GazelleV_LeftArrowScript.Assignment) a).var, ((GazelleV_LeftArrowScript.Assignment) a).expression);
}
consume();
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("Consumed identifier " + t + ", next token: " + token() + ", inner: " + inner);
return parseExprStartingWithIdentifier(t, inner);
}
if (eq(t, "(")) {
consume();
GazelleV_LeftArrowScript.Evaluable e = parseExpr_inParens();
consume(")");
return inner ? e : parseCall(e);
}
if (isOneOf("&", "|") && empty(nextSpace()) && is(1, token())) {
return parseBinaryOperator();
}
throw fail("Identifier, literal, operator or opening parentheses expected (got: " + quote(t));
}
public GazelleV_LeftArrowScript.Evaluable parseExpr_inParens() {
boolean inParensOld = inParens;
inParens = true;
try {
return parseExpr();
} finally {
inParens = inParensOld;
}
}
public GazelleV_LeftArrowScript.Evaluable parseNumberLiteral() {
String t = consumeMultiTokenLiteral();
if (swic(t, "0x"))
return _const(parseHexInt(dropFirst(t, 2)));
if (swic(t, "0b"))
return _const(intFromBinary(dropFirst(t, 2)));
if (isInteger(t))
return _const(parseInt(t));
if (ewic(t, "f"))
return _const(parseFloat(t));
if (endsWith(t, "L"))
return _const(parseLong(t));
return _const(parseDouble(t));
}
public GazelleV_LeftArrowScript.Evaluable parseBinaryOperator() {
boolean and = is("&");
next(2);
GazelleV_LeftArrowScript.Evaluable a = parseInnerExpr();
GazelleV_LeftArrowScript.Evaluable b = parseInnerExpr();
return and ? new GazelleV_LeftArrowScript.BoolAnd(a, b) : new GazelleV_LeftArrowScript.BoolOr(a, b);
}
public boolean qualifiedNameContinues() {
return empty(prevSpace()) && eq(token(), ".") && empty(nextSpace()) && isIdentifier(token(1));
}
public GazelleV_LeftArrowScript.Evaluable parseNewExpr() {
String className = assertIdentifier(tpp());
parseTypeArguments(null);
LASClassDef cd = classDefs.get(className);
if (cd != null)
return new GazelleV_LeftArrowScript.NewObject_LASClass(new ResolvableLASClass(lasClassLoader, cd));
var type = knownVars.get(className);
if (type != null)
return new GazelleV_LeftArrowScript.NewObject_UnknownClass(new GazelleV_LeftArrowScript.GetVar(className), parseArguments());
Object o = findExternalObject(className);
if (o instanceof Class) {
Class c = (Class) o;
if (c == List.class)
c = ArrayList.class;
else if (c == Map.class)
c = HashMap.class;
else if (c == Set.class)
c = HashSet.class;
return new GazelleV_LeftArrowScript.NewObject(c, parseArguments());
}
throw new ClassNotFound(className);
}
public GazelleV_LeftArrowScript.Evaluable parseExprStartingWithIdentifier(String t, boolean inner) {
if (eq(t, "true"))
return _const(true);
if (eq(t, "false"))
return _const(false);
if (eq(t, "null"))
return _const(null);
if (eq(t, "new"))
return parseNewExpr();
if (eq(t, "list") && is("{")) {
GazelleV_LeftArrowScript.Script block = parseReturnableCurlyBlock();
GazelleV_LeftArrowScript.Evaluable e = new GazelleV_LeftArrowScript.ListFromScript(block);
return inner ? e : parseCall(e);
}
if (scope != null && scope.useFixedVars) {
var type = scope.declaredVars.get(t);
if (type != null) {
var e = new GazelleV_LeftArrowScript.GetFixedVar(scope, t);
e.scope(scope);
e.returnType(type);
varAccessesToFix.add(e);
return inner ? e : parseCall(e);
}
}
var type = knownVars.get(t);
if (type != null) {
var e = new GazelleV_LeftArrowScript.GetVar(t).returnType(type);
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("Found var acccess: " + e + ", " + (!inner ? "Checking for call" : "Returning expression"));
typeHook(type);
return inner ? e : parseCall(e);
}
if (!inner) {
var fdef = lookupFunction(t);
if (fdef != null)
return new GazelleV_LeftArrowScript.CallFunction(fdef, parseArguments());
}
if (eq(t, "_context"))
return new GazelleV_LeftArrowScript.GetVarContext();
Object o = findExternalObject(t);
if (o == null) {
throw new UnknownObject(t);
} else if (o instanceof EvaluableWrapper) {
return inner ? ((EvaluableWrapper) o).expr : parseCall(((EvaluableWrapper) o).expr);
} else if (inner)
return _const(o);
else if (o instanceof Class) {
return parseExprStartingWithClass((Class) o);
} else if (o instanceof MethodOnObject) {
if (inner)
throw fail("Can't call methods in arguments");
return new GazelleV_LeftArrowScript.CallMethod(_const(((MethodOnObject) o).object), ((MethodOnObject) o).method, parseArguments());
} else
return parseCall(_const(o));
}
public GazelleV_LeftArrowScript.Evaluable parseExprStartingWithClass(Class c) {
if (atCmdEnd())
return _const(c);
if (is("("))
return new GazelleV_LeftArrowScript.NewObject(c, parseArguments());
{
var __4 = parseLambdaOpt(c);
if (__4 != null)
return __4;
}
if (isIdentifier()) {
String name = tpp();
if (hasStaticMethodNamed(c, name))
return new GazelleV_LeftArrowScript.CallMethod(_const(c), name, parseArguments());
if (isInterface(c))
return parseLambdaMethodRef(c, name);
var field = getField(c, name);
if (field != null) {
assertCmdEnd();
if (!isStaticField(field))
throw fail(field + " is not a static field");
return new GazelleV_LeftArrowScript.GetStaticField(field);
}
throw fail(name + " not found in " + c + " (looked for method or field)");
} else
throw fail("Method name expected: " + token());
}
public GazelleV_LeftArrowScript.Evaluable parseLambdaOpt(Class c) {
if (!isInterface(c))
return null;
var ptr = ptr();
var parameterized = parseTypeArgumentsOpt(c);
if (is("{"))
return finishLambdaDef(c, null);
if (consumeOpt("_")) {
String methodName = consumeIdentifier();
return new GazelleV_LeftArrowScript.LambdaMethodOnArgument(c, methodName, parseArguments());
}
int nArgs = 0;
while (isIdentifier(token(nArgs))) nArgs++;
if (!(is(nArgs, "-") && is(nArgs + 1, ">"))) {
ptr(ptr);
return null;
}
String[] argNames = consumeArray(nArgs);
skip(2);
return finishLambdaDef(c, argNames);
}
public GazelleV_LeftArrowScript.Evaluable finishLambdaDef(Class c, String[] argNames) {
AutoCloseable __8 = tempAddKnownVars(argNames);
try {
GazelleV_LeftArrowScript.Evaluable body;
if (is("{"))
body = parseReturnableCurlyBlock();
else
body = parseExpr();
var lambda = new GazelleV_LeftArrowScript.LambdaDef(c, argNames, body);
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("finishLambdaDef done:\n" + GazelleV_LeftArrowScript.indentedScriptStruct(lambda));
return lambda;
} finally {
_close(__8);
}
}
public GazelleV_LeftArrowScript.Evaluable parseLambdaMethodRef(Class c, String name) {
var fdef = lookupFunction(name);
if (fdef != null) {
GazelleV_LeftArrowScript.Evaluable[] curriedArguments = parseArguments();
return new GazelleV_LeftArrowScript.CurriedScriptFunctionLambda(c, fdef, curriedArguments);
}
Object function = findExternalObject(name);
if (function == null)
throw new UnknownObject(name);
if (function instanceof MethodOnObject) {
Object target = ((MethodOnObject) function).object;
String targetMethod = ((MethodOnObject) function).method;
GazelleV_LeftArrowScript.Evaluable[] curriedArguments = parseArguments();
return new GazelleV_LeftArrowScript.CurriedMethodLambda(c, target, targetMethod, curriedArguments);
} else if (function instanceof Class) {
Class c2 = (Class) function;
assertCmdEnd();
var ctors = constructorsWithNumberOfArguments(c2, 1);
if (empty(ctors))
throw fail("No single argument constructor found in " + c2);
return new GazelleV_LeftArrowScript.CurriedConstructorLambda(c, toArray(Constructor.class, ctors), null);
} else
throw fail(function + " is not an instantiable class or callable method");
}
public GazelleV_LeftArrowScript.FunctionDef lookupFunction(String name) {
var script = currentReturnableScript;
while (script != null) {
var f = script.functionDefs.get(name);
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
printVars("lookupFunction", "script", script, "name", name, "f", f);
if (f != null)
return f;
script = script.returnableParent;
}
return null;
}
public GazelleV_LeftArrowScript.Evaluable[] parseArguments() {
List l = new ArrayList();
try {
while (true) {
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("parseArgumentsAsList: token is " + quote(t()));
if (is("+") && empty(nextSpace()) && isIdentifier(token(1))) {
consume();
l.add(_const(token()));
continue;
}
if (consumeOpt("<")) {
GazelleV_LeftArrowScript.Evaluable a = parseFullExpr();
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("parseArgumentsAsList: token after expr is " + quote(t()));
if (a == null)
throw fail("expression expected");
l.add(a);
break;
}
GazelleV_LeftArrowScript.Evaluable a = parseOptionalInnerExpression();
if (a == null)
break;
l.add(a);
}
return toArrayOrNull(GazelleV_LeftArrowScript.Evaluable.class, l);
} catch (Throwable _e) {
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("Arguments parsed so far: " + l);
throw rethrow(_e);
}
}
public String consumeMultiTokenLiteral() {
return consumeUntilSpaceOr(() -> atCmdEnd() || is(","));
}
public boolean atCmdEnd() {
return !inParens && atEndOrLineBreak() || closerTokens.contains(token());
}
public void assertCmdEnd() {
if (!atCmdEnd())
throw fail("Expected end of command, token is: " + quote(token()));
}
public GazelleV_LeftArrowScript.Evaluable parseCall(GazelleV_LeftArrowScript.Evaluable target) {
if (atCmdEnd())
return target;
return parseCall_noCmdEndCheck(target);
}
public GazelleV_LeftArrowScript.Evaluable parseCall_noCmdEndCheck(GazelleV_LeftArrowScript.Evaluable target) {
var start = ptr();
if (isIdentifier()) {
String name = tpp();
if (eq(token(), "<") && eq(token(1), "-")) {
next(2);
GazelleV_LeftArrowScript.Evaluable rhs = parseExpr();
return new GazelleV_LeftArrowScript.SetField(target, name, rhs);
}
var args = parseArguments();
return finalizeCall(start, target, name, args);
}
if (consumeOpt("~")) {
if (isIdentifier()) {
String key = consumeIdentifier();
return parseCall(finalizeCall(start, target, "getOpt", _const(key)));
} else {
int idx = consumeInteger();
return parseCall(finalizeCall(start, target, "listGet", _const(idx)));
}
}
return target;
}
public GazelleV_LeftArrowScript.Evaluable finalizeCall(ListAndIndex start, GazelleV_LeftArrowScript.Evaluable target, String name, GazelleV_LeftArrowScript.Evaluable... args) {
return finalizeCall2(finalizeCall1(start, target, name, args));
}
public GazelleV_LeftArrowScript.Evaluable finalizeCall2(GazelleV_LeftArrowScript.CallOnTarget call) {
while (is("then")) call = parseThenCall(call);
return call;
}
public GazelleV_LeftArrowScript.CallOnTarget finalizeCall1(ListAndIndex start, GazelleV_LeftArrowScript.Evaluable target, String name, GazelleV_LeftArrowScript.Evaluable... args) {
if (magicSwitch) {
Object ext = findExternalObject(name);
if (ext instanceof MethodOnObject) {
if (nempty(args))
return new GazelleV_LeftArrowScript.CallMethodOrGlobalFunction(target, name, ((MethodOnObject) ext), args);
else
return new GazelleV_LeftArrowScript.CallMethodOrGetFieldOrGlobalFunction(target, name, ((MethodOnObject) ext));
}
}
if (nempty(args))
return new GazelleV_LeftArrowScript.CallMethod(target, name, args);
else
return linkToSrc(start, new GazelleV_LeftArrowScript.CallMethodOrGetField(target, name));
}
public A linkToSrc(ListAndIndex start, A a) {
if (a instanceof IHasTokenRangeWithSrc)
((IHasTokenRangeWithSrc) a).setTokenRangeWithSrc(new TokenRangeWithSrc(start, ptr().plus(-1)));
return a;
}
public A linkToSrc(IF0 a) {
var start = ptr();
return linkToSrc(start, a.get());
}
transient public IF1 findExternalObject;
public Object findExternalObject(String name) {
return findExternalObject != null ? findExternalObject.get(name) : findExternalObject_base(name);
}
final public Object findExternalObject_fallback(IF1 _f, String name) {
return _f != null ? _f.get(name) : findExternalObject_base(name);
}
public Object findExternalObject_base(String name) {
{
var __5 = parsePrimitiveType(name);
if (__5 != null)
return __5;
}
if (qualifiedNameContinues()) {
int idx = idx() - 2;
do next(2); while (qualifiedNameContinues());
String fqn = joinSubList(tok, idx, idx() - 1);
return classForName(fqn);
}
String fullName = globalClassNames().get(name);
if (fullName != null)
return classForName(fullName);
for (var container : unnullForIteration(functionContainers)) {
if (hasMethodNamed(container, name)) {
var moo = new MethodOnObject(container, name);
return moo;
}
var field = getField(container, name);
if (field != null && isStaticField(field))
return new EvaluableWrapper(new GazelleV_LeftArrowScript.GetStaticField(field));
}
return null;
}
public GazelleV_LeftArrowScriptParser allowTheWorld() {
return allowTheWorld(mc());
}
public GazelleV_LeftArrowScriptParser allowTheWorld(Object... functionContainers) {
for (Object o : unnullForIteration(reversed(functionContainers))) if (!contains(this.functionContainers, o)) {
this.functionContainers.add(0, o);
globalClassNames_cache = null;
}
return this;
}
public void printFunctionDefs(GazelleV_LeftArrowScript.Script script) {
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print(values(script.functionDefs));
}
public AutoCloseable tempAddKnownVars(String... vars) {
return tempAddKnownVars(asList(vars));
}
public AutoCloseable tempAddKnownVars(Iterable vars) {
var newVars = mapWithSingleValue(vars, new LASValueDescriptor());
return tempAddKnownVars(newVars);
}
public AutoCloseable tempAddKnownVars(Map newVars) {
if (scope != null)
for (var __1 : _entrySet(newVars)) {
var name = __1.getKey();
var type = __1.getValue();
scope.addDeclaredVar(name, type);
}
return tempMapPutAll(knownVars, newVars);
}
public GazelleV_LeftArrowScript.FunctionDef parseFunctionDefinition(Map functionDefsToAddTo) {
consume("def");
String functionName = assertIdentifier(tpp());
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("parseFunctionDefinition " + functionName);
LinkedHashMap args = new LinkedHashMap();
while (isIdentifier()) {
String arg = tpp();
var type = typeToValueDescriptor(parseColonTypeOpt());
args.put(arg, type);
}
var returnType = parseColonTypeOpt();
var fd = new GazelleV_LeftArrowScript.FunctionDef(functionName, keysList(args), null);
{
if (functionDefsToAddTo != null)
functionDefsToAddTo.put(functionName, fd);
}
var scope = newScope();
scope.useFixedVars(useFixedVarContexts);
AutoCloseable __9 = tempScope(scope);
try {
AutoCloseable __10 = tempAddKnownVars(args);
try {
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("Parsing function body");
fd.body = parseReturnableCurlyBlock();
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("Defined function " + functionName + ", added to " + functionDefsToAddTo);
fd.scope(scope);
if (returnType != null)
fd.returnType(returnType);
return fd;
} finally {
_close(__10);
}
} finally {
_close(__9);
}
}
public LASScope newScope() {
return new LASScope(scope);
}
public LASScope currentScope() {
return scope;
}
public AutoCloseable tempScope(LASScope scope) {
var oldScope = currentScope();
this.scope = scope;
return () -> {
scope.resolve();
this.scope = oldScope;
};
}
public GazelleV_LeftArrowScript.Script parseReturnableCurlyBlock() {
return (GazelleV_LeftArrowScript.Script) parseCurlyBlock(new BuildingScript().returnable(true));
}
public GazelleV_LeftArrowScript.Evaluable parseCurlyBlock(BuildingScript script) {
consume("{");
boolean inParensOld = inParens;
inParens = false;
var body = parseScript(script);
consume("}");
inParens = inParensOld;
return body;
}
public GazelleV_LeftArrowScript.Evaluable parseWhileLoop() {
consume("while");
var condition = parseExpr();
var body = parseCurlyBlock(new BuildingScript().isLoopBody(true));
return new GazelleV_LeftArrowScript.While(condition, body);
}
public GazelleV_LeftArrowScript.Evaluable parseForEach() {
return new ParseForEach().get();
}
public class ParseForEach {
public GazelleV_LeftArrowScript.Evaluable collection, body;
public IF0 finish;
public Set vars = new HashSet();
public String addVar(String var) {
return addAndReturn(vars, var);
}
public String consumeVar() {
return addVar(consumeIdentifier());
}
public void parseBody() {
AutoCloseable __11 = tempAddKnownVars(vars);
try {
body = parseCurlyBlock(new BuildingScript().isLoopBody(true));
} finally {
_close(__11);
}
}
public GazelleV_LeftArrowScript.Evaluable get() {
consume("for");
if (is(1, "to")) {
String var = consumeVar();
consume("to");
GazelleV_LeftArrowScript.Evaluable endValue = parseExpr();
parseBody();
return new GazelleV_LeftArrowScript.ForIntTo(endValue, var, body);
}
int iIn = relativeIndexOf("in");
if (iIn < 0)
throw fail("for without in");
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("iIn", iIn);
if (iIn == 1) {
String var = consumeVar();
finish = () -> new GazelleV_LeftArrowScript.ForEach(collection, var, body);
} else if (iIn == 2) {
if (consumeOpt("iterator")) {
String var = consumeVar();
finish = () -> new GazelleV_LeftArrowScript.ForIterator(collection, var, body);
} else if (consumeOpt("nested")) {
String var = consumeVar();
finish = () -> new GazelleV_LeftArrowScript.ForNested(collection, var, body);
} else
throw fail("Unknown pattern for 'for' loop");
} else if (iIn == 3) {
if (isOneOf("pair", "Pair")) {
consume();
String varA = consumeVar();
String varB = consumeVar();
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
printVars("varA", varA, "varB", varB);
finish = () -> new GazelleV_LeftArrowScript.ForPairs(collection, body, varA, varB);
} else {
String varA = consumeVar();
consume(",");
String varB = consumeVar();
finish = () -> new GazelleV_LeftArrowScript.ForKeyValue(collection, body, varA, varB);
}
} else if (iIn == 4) {
consume("index");
String varIndex = consumeVar();
consume(",");
String varElement = consumeVar();
finish = () -> new GazelleV_LeftArrowScript.ForIndex(collection, body, varIndex, varElement);
} else
throw fail("Unknown pattern for 'for' loop");
consume("in");
collection = parseExpr_inParens();
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
print("collection", collection);
parseBody();
return finish.get();
}
}
public GazelleV_LeftArrowScript.Evaluable parseIfStatement() {
consume("if");
GazelleV_LeftArrowScript.Evaluable condition, body, elseBranch = null;
{
AutoCloseable __12 = tempAdd(closerTokens, "then");
try {
condition = parseExpr();
} finally {
_close(__12);
}
}
if (consumeOpt("then")) {
AutoCloseable __13 = tempAdd(closerTokens, "else");
try {
body = parseExpr();
if (consumeOpt("else"))
elseBranch = parseExpr();
} finally {
_close(__13);
}
} else {
body = parseCurlyBlock(new BuildingScript());
if (consumeOpt("else")) {
if (is("if"))
elseBranch = parseIfStatement();
else
elseBranch = parseCurlyBlock(new BuildingScript());
}
}
return new GazelleV_LeftArrowScript.IfThen(condition, body, elseBranch);
}
public GazelleV_LeftArrowScript.Evaluable parseRepeatStatement() {
consume("repeat");
var n = parseExpr();
var body = parseCurlyBlock(new BuildingScript());
return new GazelleV_LeftArrowScript.RepeatN(n, body);
}
public void addVar(String var) {
addVar(var, new LASValueDescriptor());
}
public void addVar(String var, LASValueDescriptor type) {
knownVars.put(var, type);
}
public void addVar(String var, Class type, boolean canBeNull) {
addVar(var, typeToValueDescriptor(type, canBeNull));
}
public LASValueDescriptor typeToValueDescriptor(Type type) {
return typeToValueDescriptor(type, true);
}
public LASValueDescriptor typeToValueDescriptor(Type type, boolean canBeNull) {
return type == null ? new LASValueDescriptor() : new LASValueDescriptor.NonExact(typeToClass(type), canBeNull);
}
public Map globalClassNames_cache;
public Map globalClassNames() {
if (globalClassNames_cache == null)
globalClassNames_cache = globalClassNames_load();
return globalClassNames_cache;
}
public Map globalClassNames_load() {
var packages = mapToTreeSet(importedPackages(), pkg -> pkg + ".");
Map out = new HashMap();
for (var fc : functionContainers) if (fc instanceof Class) {
if (isAnonymousClass((Class) fc))
continue;
out.put(shortClassName((Class) fc), className((Class) fc));
}
var classContainers = classContainerPrefixes();
TreeSet classContainerSet = asTreeSet(classContainers);
out.put("List", "java.util.List");
for (var className : classNameResolver().allFullyQualifiedClassNames()) {
if (isAnonymousClassName(className))
continue;
if (!contains(className, '$')) {
String pkg = longestPrefixInTreeSet(className, packages);
if (pkg != null) {
String shortName = dropPrefix(pkg, className);
if (!shortName.contains(".") && !out.containsKey(shortName))
out.put(shortName, className);
}
}
String container = longestPrefixInTreeSet(className, classContainerSet);
if (container != null) {
String shortName = dropPrefix(container, className);
String existing = out.get(shortName);
if (existing != null) {
int priority = indexOf(classContainers, container);
String oldContainer = longestPrefixInTreeSet(existing, classContainerSet);
int oldPriority = indexOf(classContainers, oldContainer);
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
printVars("className", className, "shortName", shortName, "container", container, "priority", priority, "existing", existing, "oldPriority", oldPriority);
if (priority > oldPriority)
continue;
}
out.put(shortName, className);
}
}
for (var __0 : _entrySet(javaxClassShortcuts())) {
var key = __0.getKey();
var val = __0.getValue();
String fullName = out.get(val);
if (fullName != null)
out.put(key, fullName);
}
return out;
}
transient public IF0> importedPackages;
public Collection importedPackages() {
return importedPackages != null ? importedPackages.get() : importedPackages_base();
}
final public Collection importedPackages_fallback(IF0> _f) {
return _f != null ? _f.get() : importedPackages_base();
}
public Collection importedPackages_base() {
return itemPlus("java.lang", standardImports_fullyImportedPackages());
}
public void addClassAlias(String alias, String longName) {
String fullName = globalClassNames().get(longName);
if (fullName != null)
globalClassNames().put(alias, fullName);
}
public List classContainerPrefixes() {
return map(functionContainers, fc -> className(fc) + "$");
}
static public class UnknownObject extends RuntimeException implements IFieldsToList {
public String name;
public UnknownObject() {
}
public UnknownObject(String name) {
this.name = name;
}
public String toString() {
return shortClassName_dropNumberPrefix(this) + "(" + name + ")";
}
public Object[] _fieldsToList() {
return new Object[] { name };
}
public String getMessage() {
return "Unknown object: " + name;
}
}
static public class ClassNotFound extends UnknownObject {
public ClassNotFound(String className) {
super(className);
}
public String getMessage() {
return "Class not found: " + name;
}
}
public LASClassDef parseClassDef() {
consume("class");
LASClassDef classDef = new LASClassDef();
classDef.verbose(scaffoldingEnabled());
if (nempty(classDefPrefix))
classDef.classDefPrefix(classDefPrefix);
String name = consumeIdentifier();
classDef.userGivenName(name);
consume("{");
while (!is("}")) {
if (is(";")) {
next();
continue;
}
if (is("def")) {
AutoCloseable __14 = tempAddKnownVars("this");
try {
GazelleV_LeftArrowScript.FunctionDef fd = parseFunctionDefinition(null);
if (GazelleV_LeftArrowScriptParser.this.scaffoldingEnabled())
printVars("knownVarsAfterFunctionDef", knownVars);
classDef.methods.add(fd);
continue;
} finally {
_close(__14);
}
}
LASClassDef.FieldDef fd = new LASClassDef.FieldDef();
fd.name(consumeIdentifier());
var type = parseColonType();
fd.type(type);
classDef.fields.add(fd);
}
consume("}");
classDefs.put(name, classDef);
return classDef;
}
public Type parseColonTypeOpt() {
if (is(":"))
return parseColonType();
return null;
}
public Type parseColonType() {
consume(":");
return parseType();
}
public Type parseType() {
String typeName = consumeIdentifier();
Object type = findExternalObject(typeName);
if (!(type instanceof Class))
throw new ClassNotFound(typeName);
return parseArrayType(parseTypeArguments((Type) type));
}
public Type parseArrayType(Type type) {
while (is("[") && is(1, "]")) {
consume(2);
type = new GenericArrayTypeImpl(type);
}
return type;
}
final public Type parseTypeArgumentsOpt(Type type) {
return parseTypeArguments(type);
}
public Type parseTypeArguments(Type type) {
if (is("<") && empty(nextSpace()) && isIdentifier(token(1))) {
next();
List args = new ArrayList();
while (true) {
args.add(parseType());
if (is(">"))
break;
consume(",");
}
consume(">");
if (type != null)
type = new ParameterizedTypeImpl(null, type, toTypedArray(Type.class, args));
}
return type;
}
transient public IF1 classForName;
public Class classForName(String name) {
return classForName != null ? classForName.get(name) : classForName_base(name);
}
final public Class classForName_fallback(IF1 _f, String name) {
return _f != null ? _f.get(name) : classForName_base(name);
}
public Class classForName_base(String name) {
try {
return Class.forName(name);
} catch (Exception __e) {
throw rethrow(__e);
}
}
public void copyFunctionContainersFrom(GazelleV_LeftArrowScriptParser parser) {
functionContainers = cloneList(parser.functionContainers);
globalClassNames_cache = parser.globalClassNames();
}
public ClassNameResolver classNameResolver() {
if (classNameResolver == null)
classNameResolver = new ClassNameResolver().byteCodePath(assertNotNull(getBytecodePathForClass(this))).init();
return classNameResolver;
}
public GazelleV_LeftArrowScriptParser classNameResolver(ClassNameResolver classNameResolver) {
this.classNameResolver = classNameResolver;
return this;
}
public GazelleV_LeftArrowScript.Evaluable parseStringLiteral() {
return _const(unquote_relaxedMLS(consume()));
}
}
static public class G22LeftArrowScript extends ConceptWithChangeListeners {
static final public String _fieldOrder = "description text clearedForAutoRun editingText importNote runOnProjectOpen runOrder runCount lastResultByMode compileResultForAutoRun compileResultForSaved";
public transient FieldVar varDescription_cache;
public FieldVar varDescription() {
if (varDescription_cache == null)
varDescription_cache = varDescription_load();
return varDescription_cache;
}
public FieldVar varDescription_load() {
return new FieldVar(this, "description", () -> description(), description -> description(description));
}
final public G22LeftArrowScript setDescription(String description) {
return description(description);
}
public G22LeftArrowScript description(String description) {
if (!eq(this.description, description)) {
this.description = description;
change();
}
return this;
}
final public String getDescription() {
return description();
}
public String description() {
return description;
}
public String description;
public transient FieldVar varText_cache;
public FieldVar varText() {
if (varText_cache == null)
varText_cache = varText_load();
return varText_cache;
}
public FieldVar varText_load() {
return new FieldVar(this, "text", () -> text(), text -> text(text));
}
final public G22LeftArrowScript setText(String text) {
return text(text);
}
public G22LeftArrowScript text(String text) {
if (!eq(this.text, text)) {
this.text = text;
change();
}
return this;
}
final public String getText() {
return text();
}
public String text() {
return text;
}
public String text;
public transient FieldVar> varClearedForAutoRun_cache;
public FieldVar> varClearedForAutoRun() {
if (varClearedForAutoRun_cache == null)
varClearedForAutoRun_cache = varClearedForAutoRun_load();
return varClearedForAutoRun_cache;
}
public FieldVar> varClearedForAutoRun_load() {
return new FieldVar>(this, "clearedForAutoRun", () -> clearedForAutoRun(), clearedForAutoRun -> clearedForAutoRun(clearedForAutoRun));
}
final public G22LeftArrowScript setClearedForAutoRun(ClearForAutoRun clearedForAutoRun) {
return clearedForAutoRun(clearedForAutoRun);
}
public G22LeftArrowScript clearedForAutoRun(ClearForAutoRun clearedForAutoRun) {
if (!eq(this.clearedForAutoRun, clearedForAutoRun)) {
this.clearedForAutoRun = clearedForAutoRun;
change();
}
return this;
}
final public ClearForAutoRun getClearedForAutoRun() {
return clearedForAutoRun();
}
public ClearForAutoRun clearedForAutoRun() {
return clearedForAutoRun;
}
public ClearForAutoRun clearedForAutoRun;
public transient FieldVar varEditingText_cache;
public FieldVar varEditingText() {
if (varEditingText_cache == null)
varEditingText_cache = varEditingText_load();
return varEditingText_cache;
}
public FieldVar varEditingText_load() {
return new FieldVar(this, "editingText", () -> editingText(), editingText -> editingText(editingText));
}
final public G22LeftArrowScript setEditingText(String editingText) {
return editingText(editingText);
}
public G22LeftArrowScript editingText(String editingText) {
if (!eq(this.editingText, editingText)) {
this.editingText = editingText;
change();
}
return this;
}
final public String getEditingText() {
return editingText();
}
public String editingText() {
return editingText;
}
public String editingText;
public transient FieldVar varImportNote_cache;
public FieldVar varImportNote() {
if (varImportNote_cache == null)
varImportNote_cache = varImportNote_load();
return varImportNote_cache;
}
public FieldVar varImportNote_load() {
return new FieldVar(this, "importNote", () -> importNote(), importNote -> importNote(importNote));
}
final public G22LeftArrowScript setImportNote(String importNote) {
return importNote(importNote);
}
public G22LeftArrowScript importNote(String importNote) {
if (!eq(this.importNote, importNote)) {
this.importNote = importNote;
change();
}
return this;
}
final public String getImportNote() {
return importNote();
}
public String importNote() {
return importNote;
}
public String importNote;
public boolean runOnProjectOpen = false;
public String runOrder;
public long runCount;
public Map>> lastResultByMode;
@Override
public void _doneLoading2() {
cMigrateField(this, "code", "text");
}
public String myType() {
return dropPrefix("G22", shortClassName(this));
}
public String toString() {
return or2(description, myType() + " " + id);
}
public void initEditingText() {
editingText(unnull(or(editingText, text)));
}
public void receiveEditingText(String text) {
editingText(text);
}
public String stableText() {
return text;
}
final public void save() {
completeEdit();
}
public void completeEdit() {
String t = editingText;
if (t != null) {
setTextWithHistory(t);
}
}
public void setTextWithHistory(String text) {
if (eq(this.text, text))
return;
text(text);
saveTextToHistory();
}
public void discardEdit() {
String text = editedText();
if (text == null)
return;
saveFieldToHistory("discardingEdit", text);
editingText(null);
}
public String textForEditing() {
initEditingText();
return editingText;
}
public File historyFile() {
return fileInConceptsDir("History/" + shortDynName(this) + id + ".history");
}
public void saveTextToHistory() {
saveFieldToHistory("text", text);
}
public void saveFieldToHistory(String field, String value) {
File historyFile = historyFile();
if (historyFile == null)
return;
String contents = value == null ? " empty" : " (" + nLines(value) + ", " + nChars(value) + "):\n" + indentx(value) + "\n" + "\n";
appendToTextFile(historyFile, "\n===\n" + "Concept ID: " + id + "\n" + "Date: " + dateWithMSUTC() + "\n" + firstToUpper(field) + contents + "===" + "\n");
}
public boolean isSaved() {
return text != null;
}
public boolean isSavedDistinctFromAutoRunVersion() {
return isSaved() && !eq(text, codeForAutoRun());
}
public boolean isEditing() {
return editedText() != null;
}
public boolean isClearForAutoRun() {
return clearedForAutoRun != null;
}
public String editedText() {
return eq(editingText, text) ? null : editingText;
}
public String codeForAutoRun() {
return getVar(clearedForAutoRun());
}
public String safestCode() {
return or(codeForAutoRun(), stableText());
}
public void clearForAutoRun() {
if (!isSaved())
return;
String text = text();
saveFieldToHistory("Auto-runnable code", text);
clearedForAutoRun(new ClearForAutoRun(text));
}
public void forgetAutoRunCode() {
if (!isClearForAutoRun())
return;
saveFieldToHistory("Auto-runnable code", null);
clearedForAutoRun(null);
compileResultForAutoRun = null;
}
public void forgetCompileResults() {
compileResultForAutoRun = compileResultForSaved = null;
}
public G22Utils g22utils() {
return assertNotNull("g22utils", main.g22utils(_concepts()));
}
public GazelleV_LeftArrowScriptParser makeParser() {
return g22utils().leftArrowParser();
}
public LASCompileResult newCompileResult() {
return new LASCompileResult();
}
transient public LASCompileResult compileResultForAutoRun;
public LASCompileResult compileForAutoRun() {
String code = codeForAutoRun();
if (code == null)
return null;
var cr = compileResultForAutoRun;
if (cr != null && eq(cr.script, code))
return cr;
cr = newCompileResult();
cr.script(code);
var parser = makeParser();
cr.parser(parser);
cr.compile();
return compileResultForAutoRun = cr;
}
transient public LASCompileResult compileResultForSaved;
public LASCompileResult compileSaved() {
String code = stableText();
if (code == null)
return null;
var cr = compileResultForSaved;
if (cr != null && eq(cr.script, code))
return cr;
cr = newCompileResult();
cr.script(code);
var parser = makeParser();
cr.parser(parser);
cr.compile();
return compileResultForSaved = cr;
}
public LASCompileResult safestCompileResult() {
{
var __1 = compileForAutoRun();
if (__1 != null)
return __1;
}
return compileSaved();
}
public Object evaluateWithoutTimeout() {
var cr = safestCompileResult();
if (cr == null)
throw fail("Not saved: " + this);
AutoCloseable __2 = g22utils().enter();
try {
return cr.parsedScriptMandatory().get();
} finally {
_close(__2);
}
}
public Object evaluateAutoRunWithoutTimeout() {
var cr = compileForAutoRun();
if (cr == null)
throw fail("Not cleared for auto-run: " + this);
AutoCloseable __3 = g22utils().enter();
try {
return cr.parsedScriptMandatory().get();
} finally {
_close(__3);
}
}
public String renderRunOnProjectOpenStatus() {
return runOnProjectOpen ? "Yes" + appendBracketed(appendPrefixIfNempty("prio ", runOrder)) : null;
}
}
static public class WrappedCloseable implements IAutoCloseableF0 {
public WrappedCloseable() {
}
public A closeable;
public WrappedCloseable(A closeable) {
this.closeable = closeable;
}
public A get() {
return closeable;
}
public void close() {
try {
beforeClose();
main.close(closeable);
} catch (Exception __e) {
throw rethrow(__e);
}
}
public void beforeClose() {
}
}
public interface IHasChangeListeners {
public IHasChangeListeners onChange(Runnable r);
public IHasChangeListeners removeChangeListener(Runnable r);
default public IHasChangeListeners onChangeAndNow(Runnable l) {
onChange(l);
callF(l);
return this;
}
}
public interface IntSize {
public int size();
}
static public class ImageSurface_PositionToolTip extends ImageSurfaceMouseHandler {
public ImageSurface_PositionToolTip(ImageSurface is) {
if (containsInstance(is.tools, ImageSurface_PositionToolTip.class))
return;
register(is);
}
final public void mouseDragged(MouseEvent e) {
mouseMoved(e);
}
public void mouseMoved(MouseEvent e) {
Pt p = getPt(e);
String s = str(p);
var img = is.getImage();
if (img != null && p.x >= 0 && p.y >= 0 && p.x < img.getWidth() && p.y < img.getHeight())
s += " - " + intToHex_fullLength(img.getRGB(p.x, p.y));
setToolTip(is, s);
}
}
public interface TransientObject {
}
static public class G22Variable extends ConceptWithChangeListeners implements IPersistenceInfo, AutoCloseable {
static final public String _fieldOrder = "name value persistent autoClose big";
public transient FieldVar varName_cache;
public FieldVar varName() {
if (varName_cache == null)
varName_cache = varName_load();
return varName_cache;
}
public FieldVar varName_load() {
return new FieldVar(this, "name", () -> name(), name -> name(name));
}
final public G22Variable setName(String name) {
return name(name);
}
public G22Variable name(String name) {
if (!eq(this.name, name)) {
this.name = name;
change();
}
return this;
}
final public String getName() {
return name();
}
public String name() {
return name;
}
public String name;
volatile public Object value;
public transient FieldVar