findComponentExpression property

Expression? get findComponentExpression

Attempts to find and return the closest expression that encloses this and is an independent Nocterm Component.

Returns null if nothing is found.

Implementation

Expression? get findComponentExpression {
  for (var node = this; node != null; node = node.parent) {
    if (!node.isComponentExpression) {
      if (node is ArgumentList || node is Statement || node is FunctionBody) {
        return null;
      }
      continue;
    }

    if (node is AssignmentExpression) {
      return null;
    }

    final parent = node.parent;

    if (parent is AssignmentExpression) {
      if (parent.rightHandSide == node) {
        return node as Expression;
      }
      return null;
    }

    if (parent is ArgumentList ||
        parent is ConditionalExpression && parent.thenExpression == node ||
        parent is ConditionalExpression && parent.elseExpression == node ||
        parent is ExpressionFunctionBody && parent.expression == node ||
        parent is ForElement && parent.body == node ||
        parent is IfElement && parent.thenElement == node ||
        parent is IfElement && parent.elseElement == node ||
        parent is ListLiteral ||
        parent is NamedExpression && parent.expression == node ||
        parent is Statement ||
        parent is SwitchExpressionCase && parent.expression == node ||
        parent is VariableDeclaration) {
      return node as Expression;
    }
  }
  return null;
}