Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ javaVersion=17
gradleVersion=7.6
org.gradle.jvmargs=-Xmx4096m
lcaacGroup=ch.kleis.lcaac
lcaacVersion=1.7.12
lcaacVersion=1.8.0
5 changes: 5 additions & 0 deletions plugin/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@

## [Unreleased]

## [1.8.0]

- Updated dependency LCAAC core
- Support for annotation @cached

## [1.7.12]

- Adapt to latest idea build `251.*`
Expand Down
2 changes: 1 addition & 1 deletion plugin/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ sourceSets {
}

dependencies {
implementation("ch.kleis.lcaac:core:1.7.11")
implementation("ch.kleis.lcaac:core:1.8.0")

implementation(files(layout.buildDirectory.dir("stdlib/ef3.1")) {
builtBy("generateEmissionFactors31")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,22 @@ package ch.kleis.lcaac.plugin.actions
import ch.kleis.lcaac.core.datasource.ConnectorFactory
import ch.kleis.lcaac.core.datasource.DefaultDataSourceOperations
import ch.kleis.lcaac.core.datasource.csv.CsvConnectorBuilder
import ch.kleis.lcaac.core.datasource.resilio_db.ResilioDbConnectorBuilder
import ch.kleis.lcaac.core.lang.evaluator.EvaluationTrace
import ch.kleis.lcaac.core.lang.evaluator.Evaluator
import ch.kleis.lcaac.core.math.QuantityOperations
import ch.kleis.lcaac.core.math.Operations
import ch.kleis.lcaac.plugin.ide.config.LcaacConfigExtensions
import ch.kleis.lcaac.plugin.language.loader.LcaFileCollector
import ch.kleis.lcaac.plugin.language.loader.LcaLoader
import ch.kleis.lcaac.plugin.language.psi.LcaFile
import com.intellij.openapi.application.runReadAction
import com.intellij.openapi.progress.ProgressIndicator

fun <Q> traceSystemWithIndicator(
fun <Q, M> traceSystemWithIndicator(
indicator: ProgressIndicator,
file: LcaFile,
processName: String,
matchLabels: Map<String, String>,
ops: QuantityOperations<Q>,
ops: Operations<Q, M>,
): EvaluationTrace<Q> {
indicator.isIndeterminate = true

Expand All @@ -42,7 +41,6 @@ fun <Q> traceSystemWithIndicator(
symbolTable,
listOf(
CsvConnectorBuilder(),
ResilioDbConnectorBuilder(),
)
)
val sourceOps = DefaultDataSourceOperations(ops, config, factory.buildConnectors())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import ch.kleis.lcaac.core.config.LcaacConfig
import ch.kleis.lcaac.core.datasource.ConnectorFactory
import ch.kleis.lcaac.core.datasource.DefaultDataSourceOperations
import ch.kleis.lcaac.core.datasource.csv.CsvConnectorBuilder
import ch.kleis.lcaac.core.datasource.resilio_db.ResilioDbConnectorBuilder
import ch.kleis.lcaac.core.lang.SymbolTable
import ch.kleis.lcaac.core.lang.evaluator.Evaluator
import ch.kleis.lcaac.core.lang.evaluator.EvaluatorException
Expand All @@ -30,7 +29,6 @@ class CsvProcessor(
symbolTable,
listOf(
CsvConnectorBuilder(),
ResilioDbConnectorBuilder(),
)
)
private val sourceOps = DefaultDataSourceOperations(ops, config, factory.buildConnectors())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import ch.kleis.lcaac.core.datasource.ConnectorFactory
import ch.kleis.lcaac.core.datasource.DataSourceOperations
import ch.kleis.lcaac.core.datasource.DefaultDataSourceOperations
import ch.kleis.lcaac.core.datasource.csv.CsvConnectorBuilder
import ch.kleis.lcaac.core.datasource.resilio_db.ResilioDbConnectorBuilder
import ch.kleis.lcaac.core.lang.SymbolTable
import ch.kleis.lcaac.core.lang.evaluator.Evaluator
import ch.kleis.lcaac.core.lang.evaluator.ToValue
Expand Down Expand Up @@ -99,7 +98,6 @@ class SensitivityAnalysisTask(
symbolTable,
listOf(
CsvConnectorBuilder(),
ResilioDbConnectorBuilder(),
)
)
val sourceOps = DefaultDataSourceOperations(ops, config, factory.buildConnectors())
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package ch.kleis.lcaac.plugin.ide.template

import ch.kleis.lcaac.plugin.psi.LcaTypes
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiErrorElement

Expand All @@ -13,8 +12,8 @@ class ErrorHelper {
containsAllErrors(parent, "process", "substance")
}

fun containsAllErrors(elt: PsiErrorElement, vararg strings: String): Boolean {
return strings.all { elt.errorDescription.contains("LcaTokenType.${it}") }
private fun containsAllErrors(elt: PsiErrorElement, vararg strings: String): Boolean {
return strings.all { elt.errorDescription.contains(it) }
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@
HAT = "^"
EQUAL = "="
DOUBLE_QUOTE = '"'

ANNOTATION_CACHED_KEYWORD = '@cached'
]
}

Expand Down Expand Up @@ -218,7 +220,7 @@ aliasForField ::= "alias_for" "=" dataExpression
Process
*/

process ::= "process" processRef
process ::= annotation* "process" processRef
"{" (
params
| labels
Expand All @@ -237,6 +239,8 @@ process ::= "process" processRef
stubClass = "ch.kleis.lcaac.plugin.language.psi.stub.process.ProcessStub"
}

annotation ::= "@cached"

labels ::= "labels" "{" labelAssignment* "}"
labelAssignment ::= labelRef "=" STRING_LITERAL {
implements=["ch.kleis.lcaac.plugin.language.psi.type.PsiLabelAssignment"]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,8 @@ CommentContent = .*
<YYINITIAL> "between" { return LcaTypes.BETWEEN_KEYWORD; }
<YYINITIAL> "and" { return LcaTypes.AND_KEYWORD; }

<YYINITIAL> "@cached" { return LcaTypes.ANNOTATION_CACHED_KEYWORD; }

<YYINITIAL> "datasource" { return LcaTypes.DATASOURCE_KEYWORD; }
<YYINITIAL> "location" { return LcaTypes.LOCATION_KEYWORD; }
<YYINITIAL> "schema" { return LcaTypes.SCHEMA_KEYWORD; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@ class LanguageCompletion : CompletionContributor() {


override fun fillCompletionVariants(parameters: CompletionParameters, result: CompletionResultSet) {
super.fillCompletionVariants(parameters, result)

if (parameters.position.parent is PsiErrorElement) {
val parent = parameters.position.parent as PsiErrorElement
result.addElements(*extractKeyWordFromError(parent).toTypedArray())
Expand All @@ -21,22 +19,21 @@ class LanguageCompletion : CompletionContributor() {


private fun extractKeyWordFromError(elt: PsiErrorElement): List<String> {
val grp = listOfKeywordPattern.find(elt.errorDescription)?.groupValues
return if (grp?.size == 2) {
val errors = grp[1]
keywordsPattern.findAll(errors)
.map { it.groupValues }
.filter { it.size >= 2 }
.map { it[1] }
.filter { it in keywordWhiteList }
.toList()
} else {
listOf()
}
val description = elt.errorDescription
val matchingSuggestions = keys.filter {
description.contains(it)
}.mapNotNull { suggestions[it] }.flatten()
val suggestionsToRemove = matchingSuggestions
.map {
matchingSuggestions.filter { suggestion ->
it != suggestion && it.contains(suggestion) }
}.flatten().toSet()
return matchingSuggestions.minus(suggestionsToRemove)
}

private val keywordWhiteList =
hashSetOf(

private val keys =
listOf(
"meta", // All Blocks
"unit", "process", "substance", "import", "package", "variables", // Root
"name", "type", "compartment", "sub_compartment", "reference_unit", "impacts", // Substance block
Expand All @@ -50,8 +47,11 @@ class LanguageCompletion : CompletionContributor() {
"for_each", // For each
"sum", "lookup", "default_record" // Primitives
)
private val listOfKeywordPattern = Regex("(LcaTokenType.*) expected, got")
private val keywordsPattern = Regex("LcaTokenType\\.([^ ,]*)(, | or |)")
private val suggestions: Map<String, List<String>> =
keys.associateWith { listOf(it) }
.plus(
"process" to listOf("process", "@cached")
)

private fun CompletionResultSet.addElements(vararg strings: String) {
strings.forEach { this.addElement(LookupElementBuilder.create(it)) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class LcaSyntaxHighlighter : SyntaxHighlighterBase() {
DefaultLanguageHighlighterColors.IDENTIFIER
)
)
val ANNOTATION_KEYS = arrayOf(createTextAttributesKey("LCA_ANNOTATION", DefaultLanguageHighlighterColors.DOC_COMMENT_TAG_VALUE))
val EMPTY_KEYS = emptyArray<TextAttributesKey>()
val BAD_CHARACTER_KEYS = arrayOf(createTextAttributesKey("SIMPLE_BAD_CHARACTER", BAD_CHARACTER))
val STRING_LITERAL_KEYS =
Expand Down Expand Up @@ -64,6 +65,8 @@ class LcaSyntaxHighlighter : SyntaxHighlighterBase() {

COMMENT_BLOCK_START, COMMENT_BLOCK_END, COMMENT_LINE, COMMENT_CONTENT -> BLOCK_COMMENT_KEYS

ANNOTATION_CACHED_KEYWORD -> ANNOTATION_KEYS

else -> EMPTY_KEYS
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,13 +66,24 @@ class LcaMapper<Q>(
biosphere = biosphere,
impacts = impacts,
)
val annotations = annotations(psiProcess.annotationList)
return EProcessTemplate(
params,
locals,
body,
annotations,
)
}

private fun annotations(psiAnnotationList: List<LcaAnnotation>): Set<ProcessAnnotation> {
return psiAnnotationList.mapNotNull {
when (it.text) {
"@cached" -> ProcessAnnotation.CACHED
else -> null
}
}.toSet()
}

private fun generateTechnoProductExchanges(
psiProcess: PsiProcess,
symbolTable: SymbolTable<Q>,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import ch.kleis.lcaac.core.assessment.ContributionAnalysisProgram
import ch.kleis.lcaac.core.datasource.ConnectorFactory
import ch.kleis.lcaac.core.datasource.DefaultDataSourceOperations
import ch.kleis.lcaac.core.datasource.csv.CsvConnectorBuilder
import ch.kleis.lcaac.core.datasource.resilio_db.ResilioDbConnectorBuilder
import ch.kleis.lcaac.core.lang.SymbolTable
import ch.kleis.lcaac.core.lang.evaluator.Evaluator
import ch.kleis.lcaac.core.lang.evaluator.EvaluatorException
Expand Down Expand Up @@ -66,7 +65,6 @@ class LcaTestRunner(
symbolTable,
listOf(
CsvConnectorBuilder(),
ResilioDbConnectorBuilder(),
)
)
val sourceOps = DefaultDataSourceOperations(ops, config, factory.buildConnectors())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ class LanguageCompletionTest : LcaCompletionTestCase() {
"unit",
"variables",
"test",
"datasource"
"datasource",
"@cached"
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,31 @@ class LcaLoaderTest : ParsingTestCase("", "lca", LcaParserDefinition()) {
assertEquals(expected, actual)
}

@Test
fun test_annotationCached() {
// given
val file = parseFile(
"hello", """
@cached
process p {
}
""".trimIndent()
) as LcaFile
val parser = LcaLoader(
sequenceOf(file),
ops,
)

// when
val actual = parser.load().getTemplate("p")!!.annotations

// then
val expected = setOf(
ProcessAnnotation.CACHED
)
assertEquals(expected, actual)
}

@Test
fun test_impactBlockForEach() {
// given
Expand Down