MCPcopy Create free account
hub / github.com/AutoHotkey/AutoHotkey / DefineClassProperty

Method DefineClassProperty

source/script.cpp:6259–6323  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

6257
6258
6259ResultType Script::DefineClassProperty(LPTSTR aBuf, bool aStatic, bool &aBufHasBraceOrNotNeeded)
6260{
6261 LPTSTR name_end = find_identifier_end(aBuf);
6262 LPTSTR param_start = omit_leading_whitespace(name_end);
6263 LPTSTR param_end, next_token;
6264 if (*param_start == '[')
6265 {
6266 param_start = omit_leading_whitespace(param_start + 1);
6267 if (*param_start == ']')
6268 return ScriptError(ERR_PROPERTY_EMPTY_BRACKETS, aBuf);
6269 param_end = param_start + FindExprDelim(param_start, ']');
6270 if (!*param_end)
6271 return ScriptError(ERR_MISSING_CLOSE_BRACKET, aBuf);
6272 next_token = omit_leading_whitespace(param_end + 1);
6273 }
6274 else
6275 {
6276 param_end = param_start;
6277 next_token = param_start;
6278 }
6279 if (!*next_token)
6280 aBufHasBraceOrNotNeeded = false;
6281 else if (*next_token == '{' && !next_token[1]
6282 || *next_token == '=' && next_token[1] == '>')
6283 aBufHasBraceOrNotNeeded = true;
6284 else
6285 return ScriptError(ERR_INVALID_LINE_IN_CLASS_DEF, aBuf);
6286
6287 // Save the property name and parameter list for later use with DefineFunc().
6288 int name_length = int(name_end - aBuf);
6289 int param_length = int(param_end - param_start);
6290 mClassPropertyDef = tmalloc(name_length + param_length + 7); // +7 for ".Get()\0"
6291 if (!mClassPropertyDef)
6292 return ScriptError(ERR_OUTOFMEM);
6293 _stprintf(mClassPropertyDef, _T("%.*s.Get(%.*s)"), name_length, aBuf, param_length, param_start);
6294
6295 Object *class_object = mClassObject[mClassObjectCount - 1];
6296 if (!aStatic)
6297 class_object = (Object *)class_object->GetOwnPropObj(_T("Prototype"));
6298 *name_end = 0; // Terminate for aBuf use below.
6299 switch (class_object->GetOwnPropType(aBuf))
6300 {
6301 case Object::PropType::Object:
6302 case Object::PropType::DynamicValue: // get/set
6303 case Object::PropType::DynamicMixed: // get/set and call
6304 return ScriptError(ERR_DUPLICATE_DECLARATION, aBuf);
6305 }
6306 mClassProperty = class_object->DefineProperty(aBuf);
6307 mClassPropertyStatic = aStatic;
6308 if (!mClassProperty)
6309 return ScriptError(ERR_OUTOFMEM);
6310
6311 if (*next_token == '=') // => expr
6312 {
6313 // mClassPropertyDef is already set up for "Get".
6314 if (!DefineClassPropertyXet(aBuf, next_token))
6315 return FAIL;
6316 // Immediately close this property definition.

Callers

nothing calls this directly

Calls 6

find_identifier_endFunction · 0.85
omit_leading_whitespaceFunction · 0.85
FindExprDelimFunction · 0.85
GetOwnPropObjMethod · 0.80
GetOwnPropTypeMethod · 0.80
DefinePropertyMethod · 0.80

Tested by

no test coverage detected