diff options
author | Norbert Preining <norbert@preining.info> | 2021-12-28 03:01:00 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2021-12-28 03:01:00 +0000 |
commit | ecdf859b6ce481abfd530425dcf6f0f764bd0001 (patch) | |
tree | 13bc161dc046876ac6c92fce5f9f5034ba9aa573 /graphics/asymptote/exp.cc | |
parent | 790995b7e79697514364450bf9c04f1b8d500838 (diff) |
CTAN sync 202112280300
Diffstat (limited to 'graphics/asymptote/exp.cc')
-rw-r--r-- | graphics/asymptote/exp.cc | 196 |
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 - |