Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
Peva Blanchard committed Jan 27, 2024
1 parent 21bdf11 commit 712e71a
Show file tree
Hide file tree
Showing 19 changed files with 407 additions and 101 deletions.
31 changes: 26 additions & 5 deletions plugin/src/main/kotlin/ch/kleis/lcaac/plugin/language/Lca.bnf
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,10 @@ dataSourceDefinition ::= 'datasource' dataSourceRef '{' (locationField | schemaD
}
locationField ::= 'location' '=' STRING_LITERAL
schemaDefinition ::= 'schema' '{' columnDefinition* '}'
columnDefinition ::= columnRef '=' dataExpression
columnDefinition ::= columnRef '=' dataExpression {
implements=["ch.kleis.lcaac.plugin.language.psi.type.PsiColumnDefinition"]
mixin="ch.kleis.lcaac.plugin.language.psi.mixin.PsiColumnDefinitionMixin"
}

/*
Global variables
Expand Down Expand Up @@ -267,15 +270,30 @@ block_impacts ::= "impacts" "{" impactExchange* "}"
*/

technoProductExchange ::= dataExpression outputProductSpec

technoInputExchange ::= terminalTechnoInputExchange
| 'for_each' dataRef 'from' dataSourceRef '{' (variables | technoInputExchange)* '}'
| technoBlockForEach
terminalTechnoInputExchange ::= dataExpression inputProductSpec
technoBlockForEach ::= 'for_each' dataRef 'from' dataSourceRef '{' (variables | technoInputExchange)* '}' {
implements=["ch.kleis.lcaac.plugin.language.psi.type.PsiBlockForEach"]
mixin="ch.kleis.lcaac.plugin.language.psi.mixin.PsiBlockForEachMixin"
}

bioExchange ::= terminalBioExchange
| 'for_each' dataRef 'in' dataSourceRef '{' (variables | bioExchange)* '}'
| bioBlockForEach
terminalBioExchange ::= dataExpression substanceSpec
bioBlockForEach ::= 'for_each' dataRef 'from' dataSourceRef '{' (variables | bioExchange)* '}' {
implements=["ch.kleis.lcaac.plugin.language.psi.type.PsiBlockForEach"]
mixin="ch.kleis.lcaac.plugin.language.psi.mixin.PsiBlockForEachMixin"
}

impactExchange ::= terminalImpactExchange
| 'for_each' dataRef 'in' dataSourceRef '{' (variables | impactExchange)* '}'
| impactBlockForEach
terminalImpactExchange ::= dataExpression indicatorRef
impactBlockForEach ::= 'for_each' dataRef 'from' dataSourceRef '{' (variables | impactExchange)* '}' {
implements=["ch.kleis.lcaac.plugin.language.psi.type.PsiBlockForEach"]
mixin="ch.kleis.lcaac.plugin.language.psi.mixin.PsiBlockForEachMixin"
}

/*
Quantity
Expand Down Expand Up @@ -383,7 +401,10 @@ dataSourceRef ::= uid {
mixin="ch.kleis.lcaac.plugin.language.psi.mixin.ref.PsiDataSourceRefMixin"
}

columnRef ::= uid
columnRef ::= uid {
implements=["ch.kleis.lcaac.plugin.language.psi.type.ref.PsiColumnRef"]
mixin="ch.kleis.lcaac.plugin.language.psi.mixin.ref.PsiColumnRefMixin"
}

/*
Spec
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
package ch.kleis.lcaac.plugin.language.psi.manipulators

import ch.kleis.lcaac.plugin.language.psi.type.PsiAssignment
import ch.kleis.lcaac.plugin.language.psi.type.PsiDataSourceDefinition
import ch.kleis.lcaac.plugin.language.psi.type.PsiGlobalAssignment
import ch.kleis.lcaac.plugin.language.psi.type.PsiLabelAssignment
import ch.kleis.lcaac.plugin.language.psi.type.*
import ch.kleis.lcaac.plugin.language.psi.type.ref.*
import ch.kleis.lcaac.plugin.language.psi.type.spec.PsiInputProductSpec
import ch.kleis.lcaac.plugin.language.psi.type.spec.PsiOutputProductSpec
import ch.kleis.lcaac.plugin.language.psi.type.spec.PsiProcessTemplateSpec
import ch.kleis.lcaac.plugin.language.psi.type.spec.PsiSubstanceSpec
import ch.kleis.lcaac.plugin.language.psi.type.trait.PsiUIDOwner
import ch.kleis.lcaac.plugin.psi.*
import ch.kleis.lcaac.plugin.psi.LcaInputProductSpec
import ch.kleis.lcaac.plugin.psi.LcaOutputProductSpec
import ch.kleis.lcaac.plugin.psi.LcaProcessTemplateSpec
import ch.kleis.lcaac.plugin.psi.LcaSubstanceSpec
import com.intellij.openapi.util.TextRange
import com.intellij.psi.AbstractElementManipulator
import com.intellij.psi.PsiElement
Expand All @@ -22,13 +18,14 @@ sealed class PsiUIDOwnerManipulator<E : PsiUIDOwner> : AbstractElementManipulato
}
}

class PsiQuantityRefManipulator : PsiUIDOwnerManipulator<PsiDataRef>()
class PsiDataRefManipulator : PsiUIDOwnerManipulator<PsiDataRef>()
class PsiSubstanceRefManipulator : PsiUIDOwnerManipulator<PsiSubstanceRef>()
class PsiProcessTemplateRefManipulator : PsiUIDOwnerManipulator<PsiProcessRef>()
class PsiLabelRefManipulator : PsiUIDOwnerManipulator<PsiLabelRef>()
class PsiParameterRefManipulator : PsiUIDOwnerManipulator<PsiParameterRef>()
class PsiProductRefManipulator : PsiUIDOwnerManipulator<PsiProductRef>()
class PsiDataSourceRefManipulator : PsiUIDOwnerManipulator<PsiDataSourceRef>()
class PsiColumnRefManipulator : PsiUIDOwnerManipulator<PsiColumnRef>()

sealed class PsiDelegateManipulator<E : PsiElement>(
private val getter: (E) -> PsiUIDOwner
Expand Down Expand Up @@ -69,3 +66,9 @@ class PsiAssignmentManipulator : PsiDelegateManipulator<PsiAssignment>(
class PsiDataSourceManipulator : PsiDelegateManipulator<PsiDataSourceDefinition>(
{ it.getDataSourceRef() }
)
class PsiColumnDefinitionManipulator : PsiDelegateManipulator<PsiColumnDefinition>(
{ it.getColumnRef() }
)
class PsiBlockForEachManipulator : PsiDelegateManipulator<PsiBlockForEach>(
{ it.getDataRef() }
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package ch.kleis.lcaac.plugin.language.psi.mixin

import ch.kleis.lcaac.plugin.language.psi.type.PsiBlockForEach
import ch.kleis.lcaac.plugin.psi.*
import com.intellij.extapi.psi.ASTWrapperPsiElement
import com.intellij.lang.ASTNode
import com.intellij.psi.PsiElement
import com.intellij.psi.ResolveState
import com.intellij.psi.scope.PsiScopeProcessor
import com.intellij.psi.util.PsiTreeUtil

abstract class PsiBlockForEachMixin(node: ASTNode) : ASTWrapperPsiElement(node), PsiBlockForEach {
override fun getDataRef(): LcaDataRef {
return PsiTreeUtil.getChildrenOfTypeAsList(this, LcaDataRef::class.java).elementAt(0)
}

override fun getValue(): LcaDataSourceExpression {
return PsiTreeUtil.getChildrenOfTypeAsList(this, LcaDataSourceExpression::class.java).elementAt(1)
}

override fun getName(): String {
return getDataRef().name
}

override fun setName(name: String): PsiElement {
getDataRef().name = name
return this
}

override fun getNameIdentifier(): PsiElement? {
return getDataRef().nameIdentifier
}

override fun processDeclarations(
processor: PsiScopeProcessor,
state: ResolveState,
lastParent: PsiElement?,
place: PsiElement
): Boolean {
for (block in getVariablesList()) {
if (!processor.execute(block, state)) {
return false
}
}
return processor.execute(this, state)
}

override fun getVariablesList(): Collection<LcaVariables> {
return PsiTreeUtil.getChildrenOfTypeAsList(this, LcaVariables::class.java)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package ch.kleis.lcaac.plugin.language.psi.mixin

import ch.kleis.lcaac.plugin.psi.LcaColumnDefinition
import ch.kleis.lcaac.plugin.psi.LcaColumnRef
import ch.kleis.lcaac.plugin.psi.LcaDataExpression
import com.intellij.extapi.psi.ASTWrapperPsiElement
import com.intellij.lang.ASTNode
import com.intellij.psi.PsiElement
import com.intellij.psi.util.PsiTreeUtil

abstract class PsiColumnDefinitionMixin(node: ASTNode) : ASTWrapperPsiElement(node), LcaColumnDefinition {
override fun getColumnRef(): LcaColumnRef {
return PsiTreeUtil.getChildrenOfTypeAsList(this, LcaColumnRef::class.java).elementAt(0)
}

override fun getValue(): LcaDataExpression {
return PsiTreeUtil.getChildrenOfTypeAsList(this, LcaDataExpression::class.java).elementAt(1)
}

override fun getName(): String {
return getColumnRef().name
}

override fun setName(name: String): PsiElement {
getColumnRef().name = name
return this
}

override fun getNameIdentifier(): PsiElement? {
return getColumnRef().nameIdentifier
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package ch.kleis.lcaac.plugin.language.psi.mixin.ref

import ch.kleis.lcaac.plugin.language.psi.reference.ColumnReference
import ch.kleis.lcaac.plugin.language.psi.reference.DataReference
import ch.kleis.lcaac.plugin.language.psi.type.ref.PsiColumnRef
import ch.kleis.lcaac.plugin.language.psi.type.ref.PsiDataRef
import com.intellij.extapi.psi.ASTWrapperPsiElement
import com.intellij.lang.ASTNode

abstract class PsiColumnRefMixin(node: ASTNode) : ASTWrapperPsiElement(node), PsiColumnRef {
override fun getReference(): ColumnReference {
return super<PsiColumnRef>.getReference()
}

override fun getName(): String {
return super<PsiColumnRef>.getName()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package ch.kleis.lcaac.plugin.language.psi.reference

import ch.kleis.lcaac.plugin.language.psi.type.ref.PsiColumnRef
import com.intellij.psi.PsiPolyVariantReferenceBase
import com.intellij.psi.ResolveResult

class ColumnReference(
element: PsiColumnRef
): PsiPolyVariantReferenceBase<PsiColumnRef>(element) {
override fun multiResolve(incompleteCode: Boolean): Array<ResolveResult> {
TODO("Not yet implemented")
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package ch.kleis.lcaac.plugin.language.psi.reference

import ch.kleis.lcaac.plugin.language.psi.type.PsiBlockForEach
import ch.kleis.lcaac.plugin.language.psi.type.ref.PsiDataRef
import ch.kleis.lcaac.plugin.psi.LcaLabels
import ch.kleis.lcaac.plugin.psi.LcaParams
Expand Down Expand Up @@ -53,6 +54,9 @@ class DataRefExactNameMatcherScopeProcessor(
return checkDecl(element.labelAssignmentList)
}

if (element is PsiBlockForEach) {
return checkDecl(listOf(element))
}
return true
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import com.intellij.psi.util.PsiTreeUtil

class DataReference(
element: PsiDataRef
) : PsiReferenceBase<PsiDataRef>(element), PsiPolyVariantReference {
) : PsiPolyVariantReferenceBase<PsiDataRef>(element) {
private val globalAssignmentRef = GlobalUIDOwnerReference(
element,
{ project, fqn ->
Expand All @@ -32,11 +32,6 @@ class DataReference(
}
)

override fun resolve(): PsiElement? {
val results = multiResolve(false).mapNotNull { it.element }
return if (results.size == 1) results.first() else null
}

override fun multiResolve(incompleteCode: Boolean): Array<ResolveResult> {
val localMatches = resolveElementLocally(
DataRefExactNameMatcherScopeProcessor(element)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package ch.kleis.lcaac.plugin.language.psi.type

import ch.kleis.lcaac.plugin.language.psi.type.ref.PsiDataRef
import ch.kleis.lcaac.plugin.psi.LcaDataSourceExpression
import ch.kleis.lcaac.plugin.psi.LcaVariables
import com.intellij.psi.PsiNameIdentifierOwner

interface PsiBlockForEach : PsiNameIdentifierOwner {
override fun getName(): String

fun getDataRef(): PsiDataRef

fun getValue(): LcaDataSourceExpression

fun getVariablesList(): Collection<LcaVariables>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ch.kleis.lcaac.plugin.language.psi.type

import ch.kleis.lcaac.plugin.language.psi.type.ref.PsiColumnRef
import ch.kleis.lcaac.plugin.psi.LcaDataExpression
import com.intellij.psi.PsiNameIdentifierOwner

interface PsiColumnDefinition : PsiNameIdentifierOwner {
override fun getName(): String
fun getColumnRef(): PsiColumnRef
fun getValue(): LcaDataExpression
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package ch.kleis.lcaac.plugin.language.psi.type.ref

import ch.kleis.lcaac.plugin.language.psi.reference.ColumnReference
import ch.kleis.lcaac.plugin.language.psi.type.trait.PsiUIDOwner

interface PsiColumnRef : PsiUIDOwner {
override fun getReference(): ColumnReference {
return ColumnReference(this)
}
}
8 changes: 7 additions & 1 deletion plugin/src/main/resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@
implementationClass="ch.kleis.lcaac.plugin.language.ide.insight.LcaAssignmentAnnotator"/>

<lang.elementManipulator forClass="ch.kleis.lcaac.plugin.language.psi.type.ref.PsiDataRef"
implementationClass="ch.kleis.lcaac.plugin.language.psi.manipulators.PsiQuantityRefManipulator"/>
implementationClass="ch.kleis.lcaac.plugin.language.psi.manipulators.PsiDataRefManipulator"/>
<lang.elementManipulator forClass="ch.kleis.lcaac.plugin.language.psi.type.ref.PsiSubstanceRef"
implementationClass="ch.kleis.lcaac.plugin.language.psi.manipulators.PsiSubstanceRefManipulator"/>
<lang.elementManipulator forClass="ch.kleis.lcaac.plugin.language.psi.type.ref.PsiProcessRef"
Expand All @@ -76,6 +76,10 @@
implementationClass="ch.kleis.lcaac.plugin.language.psi.manipulators.PsiGlobalAssignmentManipulator"/>
<lang.elementManipulator forClass="ch.kleis.lcaac.plugin.language.psi.type.PsiAssignment"
implementationClass="ch.kleis.lcaac.plugin.language.psi.manipulators.PsiAssignmentManipulator"/>
<lang.elementManipulator forClass="ch.kleis.lcaac.plugin.language.psi.type.PsiColumnDefinition"
implementationClass="ch.kleis.lcaac.plugin.language.psi.manipulators.PsiColumnDefinitionManipulator"/>
<lang.elementManipulator forClass="ch.kleis.lcaac.plugin.language.psi.type.PsiBlockForEach"
implementationClass="ch.kleis.lcaac.plugin.language.psi.manipulators.PsiBlockForEachManipulator"/>
<lang.elementManipulator forClass="ch.kleis.lcaac.plugin.language.psi.type.PsiDataSourceDefinition"
implementationClass="ch.kleis.lcaac.plugin.language.psi.manipulators.PsiDataSourceManipulator"/>
<lang.elementManipulator forClass="ch.kleis.lcaac.plugin.language.psi.type.ref.PsiLabelRef"
Expand All @@ -84,6 +88,8 @@
implementationClass="ch.kleis.lcaac.plugin.language.psi.manipulators.PsiProductRefManipulator"/>
<lang.elementManipulator forClass="ch.kleis.lcaac.plugin.language.psi.type.ref.PsiDataSourceRef"
implementationClass="ch.kleis.lcaac.plugin.language.psi.manipulators.PsiDataSourceRefManipulator"/>
<lang.elementManipulator forClass="ch.kleis.lcaac.plugin.language.psi.type.ref.PsiColumnRef"
implementationClass="ch.kleis.lcaac.plugin.language.psi.manipulators.PsiColumnDefinitionManipulator"/>
<lang.elementManipulator forClass="ch.kleis.lcaac.plugin.language.psi.type.ref.PsiParameterRef"
implementationClass="ch.kleis.lcaac.plugin.language.psi.manipulators.PsiParameterRefManipulator"/>
<lang.elementManipulator forClass="ch.kleis.lcaac.plugin.language.psi.type.spec.PsiInputProductSpec"
Expand Down
Loading

0 comments on commit 712e71a

Please sign in to comment.