summaryrefslogtreecommitdiff
path: root/graphics/asymptote/exp.cc
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2021-12-28 03:01:00 +0000
committerNorbert Preining <norbert@preining.info>2021-12-28 03:01:00 +0000
commitecdf859b6ce481abfd530425dcf6f0f764bd0001 (patch)
tree13bc161dc046876ac6c92fce5f9f5034ba9aa573 /graphics/asymptote/exp.cc
parent790995b7e79697514364450bf9c04f1b8d500838 (diff)
CTAN sync 202112280300
Diffstat (limited to 'graphics/asymptote/exp.cc')
-rw-r--r--graphics/asymptote/exp.cc196
1 files changed, 164 insertions, 32 deletions
diff --git a/graphics/asymptote/exp.cc b/graphics/asymptote/exp.cc
index dbf6886ecb..48a5c000f2 100644
--- a/graphics/asymptote/exp.cc
+++ b/graphics/asymptote/exp.cc
@@ -32,12 +32,13 @@ using namespace types;
using namespace trans;
using vm::inst;
using mem::vector;
-
+using mem::stdString;
+using vm::getPos;
#if 0
void exp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "exp",indent);
+ prettyname(out, "exp",indent, getPos());
}
#endif
@@ -132,7 +133,7 @@ tempExp::tempExp(coenv &e, varinit *v, types::ty *t)
}
void tempExp::prettyprint(ostream &out, Int indent) {
- prettyname(out, "tempExp", indent);
+ prettyname(out, "tempExp", indent, getPos());
}
types::ty *tempExp::trans(coenv &e) {
@@ -147,7 +148,7 @@ varEntryExp::varEntryExp(position pos, types::ty *t, vm::bltin f)
: exp(pos), v(new trans::varEntry(t, new bltinAccess(f), 0, position())) {}
void varEntryExp::prettyprint(ostream &out, Int indent) {
- prettyname(out, "varEntryExp", indent);
+ prettyname(out, "varEntryExp", indent, getPos());
}
types::ty *varEntryExp::getType(coenv &) {
@@ -181,11 +182,35 @@ void varEntryExp::transCall(coenv &e, types::ty *target) {
void nameExp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "nameExp",indent);
+ prettyname(out, "nameExp",indent, getPos());
value->prettyprint(out, indent+1);
}
+void nameExp::createSymMap(AsymptoteLsp::SymbolContext* symContext)
+{
+#ifdef HAVE_LSP
+ AsymptoteLsp::SymbolLit accessedName(value->getLit());
+ position basePos = getPos();
+ AsymptoteLsp::filePos castedPos = dynamic_cast<qualifiedName*>(value) ?
+ std::make_pair(stdString(basePos.filename()),
+ std::make_pair(basePos.Line(), basePos.Column() + 1)) :
+ static_cast<AsymptoteLsp::filePos>(basePos);
+
+ auto varUsageIt = symContext->symMap.varUsage.find(accessedName);
+ if (varUsageIt == symContext->symMap.varUsage.end())
+ {
+ symContext->symMap.varUsage.emplace(accessedName, castedPos);
+ }
+ else
+ {
+ varUsageIt->second.add(castedPos);
+ }
+
+ symContext->symMap.usageByLines.emplace_back(castedPos.second, accessedName);
+#endif
+}
+
void fieldExp::pseudoName::prettyprint(ostream &out, Int indent)
{
@@ -334,15 +359,15 @@ void subscriptExp::transWrite(coenv &e, types::ty *t, exp *value)
void slice::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "slice", indent);
+ prettyname(out, "slice", indent, getPos());
if (left)
left->prettyprint(out, indent+1);
else
- prettyname(out, "left omitted", indent+1);
+ prettyname(out, "left omitted", indent+1, getPos());
if (right)
right->prettyprint(out, indent+1);
else
- prettyname(out, "right omitted", indent+1);
+ prettyname(out, "right omitted", indent+1, getPos());
}
void slice::trans(coenv &e)
@@ -360,7 +385,7 @@ void slice::trans(coenv &e)
void sliceExp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "sliceExp", indent);
+ prettyname(out, "sliceExp", indent, getPos());
set->prettyprint(out, indent+1);
index->prettyprint(out, indent+1);
}
@@ -402,7 +427,7 @@ void sliceExp::transWrite(coenv &e, types::ty *t, exp *value)
void thisExp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "thisExp", indent);
+ prettyname(out, "thisExp", indent, getPos());
}
types::ty *thisExp::trans(coenv &e)
@@ -421,7 +446,7 @@ types::ty *thisExp::getType(coenv &e)
void equalityExp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "equalityExp", indent);
+ prettyname(out, "equalityExp", indent, getPos());
callExp::prettyprint(out, indent+1);
}
@@ -550,7 +575,7 @@ void scaleExp::prettyprint(ostream &out, Int indent)
{
exp *left=getLeft(); exp *right=getRight();
- prettyname(out, "scaleExp",indent);
+ prettyname(out, "scaleExp",indent, getPos());
left->prettyprint(out, indent+1);
right->prettyprint(out, indent+1);
}
@@ -635,7 +660,7 @@ types::ty *booleanExp::trans(coenv &e)
void newPictureExp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "newPictureExp",indent);
+ prettyname(out, "newPictureExp",indent, getPos());
}
types::ty *newPictureExp::trans(coenv &e)
@@ -647,7 +672,7 @@ types::ty *newPictureExp::trans(coenv &e)
void cycleExp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "cycleExp",indent);
+ prettyname(out, "cycleExp",indent, getPos());
}
types::ty *cycleExp::trans(coenv &e)
@@ -659,7 +684,7 @@ types::ty *cycleExp::trans(coenv &e)
void nullPathExp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "nullPathExp",indent);
+ prettyname(out, "nullPathExp",indent, getPos());
}
types::ty *nullPathExp::trans(coenv &e)
@@ -671,7 +696,7 @@ types::ty *nullPathExp::trans(coenv &e)
void nullExp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "nullExp",indent);
+ prettyname(out, "nullExp",indent, getPos());
}
types::ty *nullExp::trans(coenv &)
@@ -684,7 +709,7 @@ types::ty *nullExp::trans(coenv &)
void quoteExp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "quoteExp", indent);
+ prettyname(out, "quoteExp", indent, getPos());
value->prettyprint(out, indent+1);
}
@@ -697,7 +722,7 @@ types::ty *quoteExp::trans(coenv &e)
void explist::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "explist",indent);
+ prettyname(out, "explist",indent, getPos());
for (expvector::iterator p = exps.begin();
p != exps.end(); ++p)
(*p)->prettyprint(out, indent+1);
@@ -715,17 +740,34 @@ void argument::prettyprint(ostream &out, Int indent)
val->prettyprint(out, indent+1);
}
+void argument::createSymMap(AsymptoteLsp::SymbolContext* symContext)
+{
+#ifdef HAVE_LSP
+ val->createSymMap(symContext);
+#endif
+}
+
void arglist::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "arglist",indent);
+ prettyname(out, "arglist",indent, getPos());
for (argvector::iterator p = args.begin();
p != args.end(); ++p)
p->prettyprint(out, indent+1);
}
+void arglist::createSymMap(AsymptoteLsp::SymbolContext* symContext)
+{
+#ifdef HAVE_LSP
+ for (auto& p: args)
+ {
+ p.createSymMap(symContext);
+ }
+#endif
+}
+
void callExp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "callExp",indent);
+ prettyname(out, "callExp",indent, getPos());
callee->prettyprint(out, indent+1);
args->prettyprint(out, indent+1);
@@ -745,8 +787,11 @@ signature *callExp::argTypes(coenv &e, bool *searchable)
if(string(args->args[i].name) == "KEY") {
stringExp *s=dynamic_cast<stringExp*>(args->args[i].val);
if(s) {
- if(getPos().filename() == processData().fileName)
- processData().xkey[getPos().LineColumn()]=Strdup(s->getString());
+ if(getPos().filename() == processData().fileName) {
+ processDataStruct *P=&processData();
+ P->xkey[getPos().shift(P->xmapCount).LineColumn()]=
+ Strdup(s->getString());
+ }
args->args.erase(args->args.begin()+i);
--n;
if(i == n) break;
@@ -1036,10 +1081,83 @@ bool callExp::resolved(coenv &e) {
return cachedApp || cachedVarEntry;
}
+void callExp::createSymMap(AsymptoteLsp::SymbolContext* symContext)
+{
+#ifdef HAVE_LSP
+ callee->createSymMap(symContext);
+ args->createSymMap(symContext);
+
+ if (auto col=getColorInformation())
+ {
+ auto const& v=col.value();
+ auto const& colVal=std::get<0>(v);
+ auto const& alpha=std::get<1>(v);
+ auto const& beginArgPos=std::get<2>(v);
+ auto const& lastArgPos=std::get<3>(v);
+ if (alpha.has_value())
+ {
+
+ auto const& red=std::get<0>(colVal);
+ auto const& green=std::get<1>(colVal);
+ auto const& blue=std::get<2>(colVal);
+ std::tuple<double, double, double, double> rgba(red, green, blue, alpha.value());
+
+ symContext->addRGBAColor(rgba, beginArgPos, lastArgPos);
+ }
+ else
+ {
+ symContext->addRGBColor(colVal, beginArgPos, lastArgPos);
+ }
+ }
+#endif
+}
+
+
+optional<std::tuple<callExp::colorInfo, optional<double>, AsymptoteLsp::posInFile, AsymptoteLsp::posInFile>>
+callExp::getColorInformation()
+{
+#ifdef HAVE_LSP
+ if (auto* namedCallee = dynamic_cast<nameExp*>(callee))
+ {
+ std::string calleeName = static_cast<std::string>(namedCallee->getName());
+ std::vector<double> colors;
+
+ auto getLineColumn = [&argsval = args->args](int const& idx)
+ {
+ return argsval[idx].val->getPos().LineColumn();
+ };
+
+ if (calleeName == "rgb" || calleeName == "rgba")
+ {
+ for (auto const& expVec : args->args)
+ {
+ if (auto* valExp=dynamic_cast<realExp*>(expVec.val))
+ {
+ colors.push_back(valExp->getValue<double>());
+ } else if (auto* valExpI=dynamic_cast<intExp*>(expVec.val))
+ {
+ colors.push_back(valExpI->getValue<double>());
+ }
+ }
+ }
+ if (calleeName == "rgb" && colors.size() == 3)
+ {
+ callExp::colorInfo col(colors[0], colors[1], colors[2]);
+ return std::make_tuple(col, optional<double>(), callee->getPos().LineColumn(), getLineColumn(2));
+ }
+ else if (calleeName == "rgba" && colors.size() == 4)
+ {
+ callExp::colorInfo col(colors[0], colors[1], colors[2]);
+ return std::make_tuple(col, optional<double>(colors[3]), callee->getPos().LineColumn(), getLineColumn(3));
+ }
+ }
+#endif
+ return nullopt;
+}
void pairExp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "pairExp",indent);
+ prettyname(out, "pairExp",indent, getPos());
x->prettyprint(out, indent+1);
y->prettyprint(out, indent+1);
@@ -1057,7 +1175,7 @@ types::ty *pairExp::trans(coenv &e)
void tripleExp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "tripleExp",indent);
+ prettyname(out, "tripleExp",indent, getPos());
x->prettyprint(out, indent+1);
y->prettyprint(out, indent+1);
@@ -1077,7 +1195,7 @@ types::ty *tripleExp::trans(coenv &e)
void transformExp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "transformExp",indent);
+ prettyname(out, "transformExp",indent, getPos());
x->prettyprint(out, indent+1);
y->prettyprint(out, indent+1);
@@ -1103,7 +1221,7 @@ types::ty *transformExp::trans(coenv &e)
void castExp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "castExp",indent);
+ prettyname(out, "castExp",indent, getPos());
target->prettyprint(out, indent+1);
castee->prettyprint(out, indent+1);
@@ -1152,10 +1270,17 @@ types::ty *castExp::getType(coenv &e)
return target->trans(e, true);
}
+void castExp::createSymMap(AsymptoteLsp::SymbolContext* symContext)
+{
+#ifdef HAVE_LSP
+ castee->createSymMap(symContext);
+#endif
+}
+
void conditionalExp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "conditionalExp",indent);
+ prettyname(out, "conditionalExp",indent, getPos());
test->prettyprint(out, indent+1);
onTrue->prettyprint(out, indent+1);
@@ -1269,7 +1394,7 @@ types::ty *conditionalExp::getType(coenv &e)
void orExp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "orExp", indent);
+ prettyname(out, "orExp", indent, getPos());
left->prettyprint(out, indent+1);
right->prettyprint(out, indent+1);
@@ -1305,7 +1430,7 @@ void orExp::transConditionalJump(coenv &e, bool cond, label dest)
void andExp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "andExp", indent);
+ prettyname(out, "andExp", indent, getPos());
left->prettyprint(out, indent+1);
right->prettyprint(out, indent+1);
@@ -1340,7 +1465,7 @@ void andExp::transConditionalJump(coenv &e, bool cond, label dest)
void joinExp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "joinExp",indent);
+ prettyname(out, "joinExp",indent, getPos());
callee->prettyprint(out, indent+1);
args->prettyprint(out, indent+1);
@@ -1374,7 +1499,7 @@ types::ty *specExp::getType(coenv &e)
void assignExp::prettyprint(ostream &out, Int indent)
{
- prettyname(out, "assignExp",indent);
+ prettyname(out, "assignExp",indent, getPos());
dest->prettyprint(out, indent+1);
value->prettyprint(out, indent+1);
@@ -1431,6 +1556,14 @@ types::ty *assignExp::getType(coenv &e)
return t ? t : primError();
}
+void assignExp::createSymMap(AsymptoteLsp::SymbolContext* symContext)
+{
+#ifdef HAVE_LSP
+ dest->createSymMap(symContext);
+ value->createSymMap(symContext);
+#endif
+}
+
void selfExp::prettyprint(ostream &out, Int indent)
{
@@ -1493,4 +1626,3 @@ types::ty *postfixExp::trans(coenv &)
} // namespace absyntax
-