dmd.expression
Source: expression.d
- Expression
getRightThis(Locloc, Scope*sc, AggregateDeclarationad, Expressione1, Declarationvar, intflag= 0); - Given
var, get the right this pointer ifvaris in an outer class, but our existing this pointer is in an inner class.Parameters:Expression e1existing this AggregateDeclaration adstruct or class we need the correct this for Declaration varthe specific member of adwe're accessingReturns:Expression representing the this for thevar - Expression
resolve(Locloc, Scope*sc, Dsymbols, boolhasOverloads); - Resolve a symbol
sand wraps it in an expression object.Parameters:Loc loclocation of use of sScope* sccontext Dsymbol ssymbol to resolvebool hasOverloadsapplies if srepresents a function.truemeans it'soverloaded and will be resolved later,falsemeans it'sthe exact function symbol.Returns:sturned into an expression, ErrorExp if an error occurred - FuncDeclaration
hasThis(Scope*sc); - Determine if this is available by walking up the enclosing scopes until a function is found.Parameters:
Scope* scwhere to start looking for the enclosing function Returns:Found function if it satisfies isThis(), otherwise null - bool
isNeedThisScope(Scope*sc, Declarationd); - Determine if a this is needed to access
d.Parameters:Scope* sccontext Declaration ddeclaration to check Returns:truemeans a this is needed - Expression
resolvePropertiesOnly(Scope*sc, Expressione1); - If
e1is a property function (template), resolve it. - bool
isDotOpDispatch(Expressione); - check
eis exp.opDispatch!(tiargs) or not It's used to switch to UFCS the semantic analysis path - Expression
resolveUFCS(Scope*sc, CallExpce); - Pull out callable entity with UFCS.
- Expression
resolveUFCSProperties(Scope*sc, Expressione1, Expressione2= null); - Pull out property with UFCS.
- bool
arrayExpressionSemantic(Expressions*exps, Scope*sc, boolpreserveErrors= false); - Perform semantic() on an array of Expressions.
- void
expandTuples(Expressions*exps); - Expand tuples.
Input:
expsaray of ExpressionsOutput:
expsrewritten in place - TupleDeclaration
isAliasThisTuple(Expressione); - Expand alias this tuples.
- TemplateDeclaration
getFuncTemplateDecl(Dsymbols); - Get TemplateDeclaration enclosing FuncDeclaration.
- Expression
valueNoDtor(Expressione); - If we want the value of this expression, but do not want to call the destructor on it.
- Expression
doCopyOrMove(Scope*sc, Expressione); - Handle the postblit call on lvalue, or the move of rvalue.
- struct
UnionExp; - int
RealEquals(real_tx1, real_tx2); - Test to see if two reals are the same. Regard NaN's as equivalent. Regard +0 and -0 as different.
- DotIdExp
typeDotIdExp(Locloc, Typetype, Identifierident); - TypeDotIdExp
- Expression
resolveOpDollar(Scope*sc, ArrayExpae, Expression*pe0); - Runs semantic on
ae.arguments. Declares temporary variables if '$' was used. - Expression
resolveOpDollar(Scope*sc, ArrayExpae, IntervalExpie, Expression*pe0); - Runs semantic on se.lwr and se.upr. Declares a temporary variable if '$' was used.
- StringExp
semanticString(Scope*sc, Expressionexp, const char*s); - Resolve
expas a compile-time known string.Parameters:Scope* scscope Expression expExpression which expected as a string char* sWhat the string is expected for, will be used in error diagnostic. Returns:String literal, or null if error happens. - abstract class
Expression: dmd.root.rootobject.RootObject; http: //dlang.org/spec/expression.html#expression
- final Expression
copy(); - Does *not* do a deep
copy. - static Expression
combine(Expressione1, Expressione2); - Combine
e1ande2by CommaExp if both are not NULL. - static Expression
extractLast(Expressione, Expression*pe0); - If '
e' is a tree of commas, returns the leftmost expression by stripping off it from the tree. The remained part of the tree is returned via *pe0. Otherwise 'e' is directly returned and *pe0is set to NULL. - bool
isLvalue(); - Return !=0 if expression is an lvalue.
- Expression
toLvalue(Scope*sc, Expressione); - Give error if we're not an lvalue. If we can, convert expression to be an lvalue.
- Expression
resolveLoc(Locloc, Scope*sc); - Resolve __FILE__, __LINE__, __MODULE__, __FUNCTION__, __PRETTY_FUNCTION__ to
loc. - bool
checkType(); - Check that the expression has a valid type. If not, generates an error "... has no type".Returns:
trueif the expression is not valid.Note: When this function returns
true, checkValue() should also returntrue. - bool
checkValue(); - Check that the expression has a valid value. If not, generates an error "... has no value".Returns:
trueif the expression is not valid or has void type. - final bool
checkPurity(Scope*sc, FuncDeclarationf); - Calling function
f. Check the purity, i.e. if we're in a pure function we can only call other pure functions. Returnstrueif error occurs. - final bool
checkPurity(Scope*sc, VarDeclarationv); - Accessing variable
v. Check for purity and safety violations. Returnstrueif error occurs. - final bool
checkSafety(Scope*sc, FuncDeclarationf); - Calling function
f. Check the safety, i.e. if we're in a @safe function we can only call @safe or @trusted functions. Returnstrueif error occurs. - final bool
checkNogc(Scope*sc, FuncDeclarationf); - Calling function
f. Check the @nogc-ness, i.e. if we're in a @nogc function we can only call other @nogc functions. Returnstrueif error occurs. - final bool
checkPostblit(Scope*sc, Typet); - Check that the postblit is callable if
tis an array of structs. Returnstrueif error happens. - final bool
checkReadModifyWrite(TOKrmwOp, Expressionex= null); - Check whether the expression allows RMW operations, error with rmw operator diagnostic if not.
exis the RHS expression, or NULL if ++/-- is used (for diagnostics) Returnstrueif error occurs. - int
checkModifiable(Scope*sc, intflag= 0); Parameters:
sc: scope
flag: 1: do not issue error message for invalid modification
Returns:0: is not modifiable 1: is modifiable in default == being related to type.isMutable() 2: is modifiable, because this is a part of initializing.- Expression
toBoolean(Scope*sc); - If expression can be tested for
trueorfalse, returns the modified expression. Otherwise returns ErrorExp. - Expression
addDtorHook(Scope*sc); - Destructors are attached to VarDeclarations. Hence, if expression returns a temp that needs a destructor, make sure and create a VarDeclaration for that temp.
- final Expression
addressOf(); - Take address of expression.
- final Expression
deref(); - If this is a reference, dereference it.
- bool
isBool(boolresult); - Does this expression statically evaluate to a boolean '
result' (trueorfalse)?
- class
IntegerExp: dmd.expression.Expression; - class
ErrorExp: dmd.expression.Expression; - Use this expression for error recovery. It should behave as a 'sink' to prevent further cascaded error messages.
- class
RealExp: dmd.expression.Expression; - class
ComplexExp: dmd.expression.Expression; - class
IdentifierExp: dmd.expression.Expression; - class
DollarExp: dmd.expression.IdentifierExp; - class
DsymbolExp: dmd.expression.Expression; - Won't be generated by parser.
- class
ThisExp: dmd.expression.Expression; http: //dlang.org/spec/expression.html#this
- class
SuperExp: dmd.expression.ThisExp; http: //dlang.org/spec/expression.html#super
- class
NullExp: dmd.expression.Expression; http: //dlang.org/spec/expression.html#
null- class
StringExp: dmd.expression.Expression; http: //dlang.org/spec/expression.html#string_literals
- final const size_t
numberOfCodeUnits(inttynto= 0); - Return the number of code units the string would be if it were re-encoded as
tynto.Parameters:int tyntocode unit type of the target encoding Returns:number of code units - const void
writeTo(void*dest, boolzero, inttyto= 0); - Write the contents of the string to
dest. Use numberOfCodeUnits() to determine size of result.Parameters:void* destdestination int tytoencoding type of the result bool zeroadd terminating 0 - final const pure dchar
getCodeUnit(size_ti); - Get the code unit at index
iParameters:size_t iindex Returns:code unit at indexi - final void
setCodeUnit(size_ti, dcharc); - Set the code unit at index
itocParameters:size_t iindex dchar ccode unit to set it to - char*
toPtr(); - If the string data is UTF-8 and can be accessed directly, return a pointer to it. Do not assume a terminating 0.Returns:pointer to string data if possible,
nullif not - StringExp
toUTF8(Scope*sc); - Convert string to char[].
- final const const(char)[]
toStringz(); - Convert string contents to a 0 terminated string, allocated by mem.xmalloc().
- class
TupleExp: dmd.expression.Expression; - class
ArrayLiteralExp: dmd.expression.Expression; - [ e1, e2, e3, ... ]
http: //dlang.org/spec/expression.html#array_literals
- Expression
basis; - If !is
null, elements[] can be sparse andbasisis used for the "default" element value. In other words, non-nullelements[i] overrides this 'basis' value. - static Expressions*
copyElements(Expressione1, Expressione2= null); - Copy element Expressions in the parameters when they're ArrayLiteralExps.Parameters:
Expression e1If it's ArrayLiteralExp, its elements will be copied. Otherwise, e1itself will be pushed into the new Expressions.Expression e2If it's not null, it will be pushed/appended to the new Expressions by the same way with e1.Returns:Newly allocated Expressions. Note that it points to the original Expression values ine1ande2.
- class
AssocArrayLiteralExp: dmd.expression.Expression; - [ key0 : value0, key1 : value1, ... ]
http: //dlang.org/spec/expression.html#associative_array_literals
- enum int
stageScrub; - scrubReturnValue is running
- enum int
stageSearchPointers; - hasNonConstPointers is running
- enum int
stageOptimize; - optimize is running
- enum int
stageApply; - apply is running
- enum int
stageInlineScan; - inlineScan is running
- enum int
stageToCBuffer; - toCBuffer is running
- class
StructLiteralExp: dmd.expression.Expression; - sd( e1, e2, e3, ... )
- StructDeclaration
sd; - which aggregate this is for
- Expressions*
elements; - parallels sd.fields[] with
nullentries for fields to skip - Type
stype; - final type of result (can be different from sd's type)
- bool
useStaticInit; - if this is
true, use the StructDeclaration's init symbol - Symbol*
sym; - back end symbol to initialize with literal
- StructLiteralExp
origin; - pointer to the
origininstance of the expression. once a new expression is created,originis set to 'this'. anytime when an expression copy is created, 'origin' pointer is set to 'origin' pointer value of the original expression. - StructLiteralExp
inlinecopy; - those fields need to prevent a infinite recursion when one field of struct initialized with 'this' pointer.
- int
stageflags; - anytime when recursive function is calling, '
stageflags' marks with bit flag of current stage and unmarks before return from this function. 'inlinecopy' uses similar 'stageflags' and from multiple evaluation 'doInline' (with infinite recursion) of this expression. - Expression
getField(Typetype, uintoffset); - Gets expression at
offsetoftype. Returns NULL if not found. - int
getFieldIndex(Typetype, uintoffset); - Get index of field. Returns -1 if not found.
- class
TypeExp: dmd.expression.Expression; - Mainly just a placeholder
- class
ScopeExp: dmd.expression.Expression; - Mainly just a placeholder of Package, Module, Nspace, and TemplateInstance (including TemplateMixin)A template instance that requires IFTI: foo!tiargs(fargs) // foo!tiargs is left until CallExp::semantic() or resolveProperties()
- class
TemplateExp: dmd.expression.Expression; - Mainly just a placeholder
- class
NewExp: dmd.expression.Expression; - thisexp.new(newargs) newtype(arguments)
- class
NewAnonClassExp: dmd.expression.Expression; - thisexp.new(newargs) class baseclasses { } (arguments)
- class
SymbolExp: dmd.expression.Expression; - class
SymOffExp: dmd.expression.SymbolExp; - Offset from symbol
- class
VarExp: dmd.expression.SymbolExp; - Variable
- class
OverExp: dmd.expression.Expression; - Overload Set
- class
FuncExp: dmd.expression.Expression; - Function/Delegate literal
- class
DeclarationExp: dmd.expression.Expression; - Declaration of a symbolD grammar allows declarations only as statements. However in AST representation it can be part of any expression. This is used, for example, during internal syntax re-writes to inject hidden symbols.
- class
TypeidExp: dmd.expression.Expression; - typeid(int)
- class
TraitsExp: dmd.expression.Expression; - _traits(identifier, args...)
- class
HaltExp: dmd.expression.Expression; - class
IsExp: dmd.expression.Expression; - is(targ id tok tspec) is(targ id == tok2)
- class
UnaExp: dmd.expression.Expression; -
- final Expression
incompatibleTypes(); - The type for a unary expression is incompatible. Print error message.Returns:ErrorExp
- final void
setNoderefOperand(); - Mark the operand as will never be dereferenced, which is useful info for @safe checks. Do before semantic() on operands rewrites them.
- abstract class
BinExp: dmd.expression.Expression; -
- final Expression
incompatibleTypes(); - The types for a binary expression are incompatible. Print error message.Returns:ErrorExp
- final void
setNoderefOperands(); - Mark the operands as will never be dereferenced, which is useful info for @safe checks. Do before semantic() on operands rewrites them.
- class
BinAssignExp: dmd.expression.BinExp; - class
CompileExp: dmd.expression.UnaExp; - class
ImportExp: dmd.expression.UnaExp; - class
AssertExp: dmd.expression.UnaExp; - class
DotIdExp: dmd.expression.UnaExp; - class
DotTemplateExp: dmd.expression.UnaExp; - Mainly just a placeholder
- class
DotVarExp: dmd.expression.UnaExp; - class
DotTemplateInstanceExp: dmd.expression.UnaExp; - foo.bar!(args)
- class
DelegateExp: dmd.expression.UnaExp; - class
DotTypeExp: dmd.expression.UnaExp; - class
CallExp: dmd.expression.UnaExp; - class
AddrExp: dmd.expression.UnaExp; - class
PtrExp: dmd.expression.UnaExp; - class
NegExp: dmd.expression.UnaExp; - class
UAddExp: dmd.expression.UnaExp; - class
ComExp: dmd.expression.UnaExp; - class
NotExp: dmd.expression.UnaExp; - class
DeleteExp: dmd.expression.UnaExp; - class
CastExp: dmd.expression.UnaExp; - Possible to cast to one type while painting to another type
- class
VectorExp: dmd.expression.UnaExp; - class
SliceExp: dmd.expression.UnaExp; - e1 [lwr .. upr]
http: //dlang.org/spec/expression.html#slice_expressions
- this(Loc
loc, Expressione1, IntervalExpie);
- class
ArrayLengthExp: dmd.expression.UnaExp; -
- static Expression
rewriteOpAssign(BinExpexp); Rewrite: array.length op= e2
as: array.length = array.length op e2
or: auto tmp = &array; (*tmp).length = (*tmp).length op e2
- class
ArrayExp: dmd.expression.UnaExp; - e1 [ a0, a1, a2, a3 ,... ]
http: //dlang.org/spec/expression.html#index_expressions
- class
DotExp: dmd.expression.BinExp; - class
CommaExp: dmd.expression.BinExp; -
- const bool
isGenerated; - This is needed because AssignExp rewrites CommaExp, hence it needsto trigger the deprecation.
- bool
allowCommaExp; - Temporary variable to enable / disable deprecation of comma expressiondepending on the context. Since most constructor calls are rewritting, the only place where
falsewill be passed will be from the parser. - static void
allow(Expressionexp); - If the argument is a CommaExp, set a flag to prevent deprecation messagesIt's impossible to know from CommaExp.semantic if the result will be used, hence when there is a result (type != void), a deprecation message is always emitted. However, some construct can produce a result but won't use it (ExpStatement and for loop increment). Those should call this function to prevent unwanted deprecations to be emitted.Parameters:
Expression expAn expression that discards its result. If the argument is nullor not a CommaExp, nothing happens.
- class
IntervalExp: dmd.expression.Expression; - Mainly just a placeholder
- class
DelegateFuncptrExp: dmd.expression.UnaExp; - class
IndexExp: dmd.expression.BinExp; - e1 [ e2 ]
- class
PostExp: dmd.expression.BinExp; - For both i++ and i--
- class
PreExp: dmd.expression.UnaExp; - For both ++i and --i
- class
AssignExp: dmd.expression.BinExp; -
- final this(Loc
loc, Expressione1, Expressione2);
- class
ConstructExp: dmd.expression.AssignExp; - class
BlitExp: dmd.expression.AssignExp; - class
AddAssignExp: dmd.expression.BinAssignExp; - class
MinAssignExp: dmd.expression.BinAssignExp; - class
MulAssignExp: dmd.expression.BinAssignExp; - class
DivAssignExp: dmd.expression.BinAssignExp; - class
ModAssignExp: dmd.expression.BinAssignExp; - class
AndAssignExp: dmd.expression.BinAssignExp; - class
OrAssignExp: dmd.expression.BinAssignExp; - class
XorAssignExp: dmd.expression.BinAssignExp; - class
PowAssignExp: dmd.expression.BinAssignExp; - class
ShlAssignExp: dmd.expression.BinAssignExp; - class
ShrAssignExp: dmd.expression.BinAssignExp; - class
UshrAssignExp: dmd.expression.BinAssignExp; - class
CatAssignExp: dmd.expression.BinAssignExp; - The ~= operator. It can have one of the following operators:TOKcatass - appending T[] to T[] TOKcatelemass - appending T to T[] TOKcatdcharass - appending dchar to T[] The parser initially sets it to TOKcatass, and semantic() later decides which of the three it will be set to.
- class
AddExp: dmd.expression.BinExp; http: //dlang.org/spec/expression.html#add_expressions
- class
MinExp: dmd.expression.BinExp; - class
CatExp: dmd.expression.BinExp; http: //dlang.org/spec/expression.html#cat_expressions
- class
MulExp: dmd.expression.BinExp; http: //dlang.org/spec/expression.html#mul_expressions
- class
DivExp: dmd.expression.BinExp; http: //dlang.org/spec/expression.html#mul_expressions
- class
ModExp: dmd.expression.BinExp; http: //dlang.org/spec/expression.html#mul_expressions
- class
PowExp: dmd.expression.BinExp; http: //dlang.org/spec/expression.html#pow_expressions
- class
ShlExp: dmd.expression.BinExp; - class
ShrExp: dmd.expression.BinExp; - class
UshrExp: dmd.expression.BinExp; - class
AndExp: dmd.expression.BinExp; - class
OrExp: dmd.expression.BinExp; - class
XorExp: dmd.expression.BinExp; - class
LogicalExp: dmd.expression.BinExp; http: //dlang.org/spec/expression.html#andand_expressions
http: //dlang.org/spec/expression.html#oror_expressions
- class
CmpExp: dmd.expression.BinExp; - op is one of: TOKlt, TOKle, TOKgt, TOKge, TOKunord, TOKlg, TOKleg, TOKule, TOKul, TOKuge, TOKug, TOKue
http: //dlang.org/spec/expression.html#relation_expressions
- class
InExp: dmd.expression.BinExp; - class
RemoveExp: dmd.expression.BinExp; - This deletes the key e1 from the associative array e2
- class
EqualExp: dmd.expression.BinExp; - == and !=TOKequal and TOKnotequal
http: //dlang.org/spec/expression.html#equality_expressions
- class
IdentityExp: dmd.expression.BinExp; - is and !isTOKidentity and TOKnotidentity
http: //dlang.org/spec/expression.html#identity_expressions
- class
CondExp: dmd.expression.BinExp; - econd ? e1 : e2
http: //dlang.org/spec/expression.html#conditional_expressions
- class
DefaultInitExp: dmd.expression.Expression; - class
FileInitExp: dmd.expression.DefaultInitExp; - class
LineInitExp: dmd.expression.DefaultInitExp; - class
ModuleInitExp: dmd.expression.DefaultInitExp; - class
FuncInitExp: dmd.expression.DefaultInitExp; - class
PrettyFuncInitExp: dmd.expression.DefaultInitExp;