mirror of
https://github.com/irmen/prog8.git
synced 2025-11-02 13:16:07 +00:00
fixed assignment to a[i]^^
This commit is contained in:
@@ -603,7 +603,9 @@ class Antlr2KotlinVisitor(val source: SourceCode): AbstractParseTreeVisitor<Node
|
||||
override fun visitPointerDereferenceTarget(ctx: PointerDereferenceTargetContext): AssignTarget {
|
||||
val deref = ctx.pointerdereference().accept(this)
|
||||
return if(deref is PtrDereference)
|
||||
AssignTarget(null, null, null, null, false, deref, deref.position)
|
||||
AssignTarget(null, null, null, null, false, deref, null, deref.position)
|
||||
else if(deref is ArrayIndexedPtrDereference)
|
||||
AssignTarget(null, null, null, null, false, null, deref, deref.position)
|
||||
else
|
||||
throw SyntaxError("no support for dereferencing after array indexing yet. (Split the assignment using an intermediate variable?)", ctx.toPosition())
|
||||
}
|
||||
|
||||
@@ -595,6 +595,7 @@ data class AssignTarget(
|
||||
val multi: List<AssignTarget>?,
|
||||
val void: Boolean,
|
||||
var pointerDereference: PtrDereference? = null,
|
||||
var arrayIndexedDereference: ArrayIndexedPtrDereference? = null,
|
||||
override val position: Position
|
||||
) : Node {
|
||||
override lateinit var parent: Node
|
||||
@@ -605,6 +606,7 @@ data class AssignTarget(
|
||||
arrayindexed?.linkParents(this)
|
||||
memoryAddress?.linkParents(this)
|
||||
pointerDereference?.linkParents(this)
|
||||
arrayIndexedDereference?.linkParents(this)
|
||||
multi?.forEach { it.linkParents(this) }
|
||||
}
|
||||
|
||||
@@ -659,6 +661,7 @@ data class AssignTarget(
|
||||
multi?.toList(),
|
||||
void,
|
||||
pointerDereference?.copy(),
|
||||
arrayIndexedDereference?.copy(),
|
||||
position
|
||||
)
|
||||
override fun referencesIdentifier(nameInSource: List<String>): Boolean =
|
||||
@@ -666,6 +669,7 @@ data class AssignTarget(
|
||||
arrayindexed?.referencesIdentifier(nameInSource)==true ||
|
||||
memoryAddress?.referencesIdentifier(nameInSource)==true ||
|
||||
pointerDereference?.referencesIdentifier(nameInSource)==true ||
|
||||
arrayIndexedDereference?.referencesIdentifier(nameInSource)==true ||
|
||||
multi?.any { it.referencesIdentifier(nameInSource)}==true
|
||||
|
||||
fun inferType(program: Program): InferredTypes.InferredType {
|
||||
@@ -678,6 +682,7 @@ data class AssignTarget(
|
||||
arrayindexed != null -> arrayindexed!!.inferType(program)
|
||||
memoryAddress != null -> InferredTypes.knownFor(BaseDataType.UBYTE)
|
||||
pointerDereference != null -> pointerDereference!!.inferType(program)
|
||||
arrayIndexedDereference != null -> arrayIndexedDereference!!.inferType(program)
|
||||
else -> InferredTypes.unknown() // a multi-target has no 1 particular type
|
||||
}
|
||||
}
|
||||
@@ -690,6 +695,7 @@ data class AssignTarget(
|
||||
memoryAddress != null -> DirectMemoryRead(memoryAddress!!.addressExpression.copy(), memoryAddress!!.position)
|
||||
multi != null -> throw FatalAstException("cannot turn a multi-assign into a single source expression")
|
||||
pointerDereference != null -> pointerDereference!!.copy()
|
||||
arrayIndexedDereference != null -> arrayIndexedDereference!!.copy()
|
||||
else -> throw FatalAstException("invalid assignment target")
|
||||
}
|
||||
}
|
||||
@@ -711,6 +717,11 @@ data class AssignTarget(
|
||||
pointerDereference!!.chain==value.chain
|
||||
} else false
|
||||
}
|
||||
arrayIndexedDereference != null -> {
|
||||
return if (value is ArrayIndexedPtrDereference) {
|
||||
arrayIndexedDereference!!.chain==value.chain && arrayIndexedDereference!!.derefLast==value.derefLast
|
||||
} else false
|
||||
}
|
||||
else -> false
|
||||
}
|
||||
}
|
||||
@@ -739,6 +750,9 @@ data class AssignTarget(
|
||||
pointerDereference !=null && other.pointerDereference !=null -> {
|
||||
return pointerDereference!! isSameAs other.pointerDereference!!
|
||||
}
|
||||
arrayIndexedDereference !=null && other.arrayIndexedDereference !=null -> {
|
||||
return arrayIndexedDereference!! isSameAs other.arrayIndexedDereference!!
|
||||
}
|
||||
this.multi != null && other.multi != null -> return this.multi == other.multi
|
||||
else -> return false
|
||||
}
|
||||
|
||||
@@ -450,6 +450,7 @@ abstract class AstWalker {
|
||||
assignTarget.identifier?.accept(this, assignTarget)
|
||||
assignTarget.memoryAddress?.accept(this, assignTarget)
|
||||
assignTarget.pointerDereference?.accept(this, assignTarget)
|
||||
assignTarget.arrayIndexedDereference?.accept(this, assignTarget)
|
||||
assignTarget.multi?.forEach { it.accept(this, assignTarget) }
|
||||
track(after(assignTarget, parent), assignTarget, parent)
|
||||
}
|
||||
|
||||
@@ -162,6 +162,7 @@ interface IAstVisitor {
|
||||
assignTarget.identifier?.accept(this)
|
||||
assignTarget.memoryAddress?.accept(this)
|
||||
assignTarget.pointerDereference?.accept(this)
|
||||
assignTarget.arrayIndexedDereference?.accept(this)
|
||||
assignTarget.multi?.forEach { it.accept(this) }
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user