GDevelop Core
Core library for developing platforms and tools compatible with GDevelop.
InstructionMetadata.h
1 /*
2  * GDevelop Core
3  * Copyright 2008-2016 Florian Rival ([email protected]). All rights
4  * reserved. This project is released under the MIT License.
5  */
6 
7 #pragma once
8 
9 #include "AbstractFunctionMetadata.h"
10 
11 #include <algorithm>
12 #include <functional>
13 #include <map>
14 #include <memory>
15 
16 #include "GDCore/Events/Instruction.h"
17 #include "GDCore/String.h"
18 #include "ParameterMetadata.h"
19 #include "ParameterOptions.h"
20 
21 namespace gd {
22 class Project;
23 class Layout;
24 class EventsCodeGenerator;
25 class EventsCodeGenerationContext;
26 class SerializerElement;
27 } // namespace gd
28 
29 namespace gd {
30 
39  public:
43  InstructionMetadata(const gd::String &extensionNamespace,
44  const gd::String &name,
45  const gd::String &fullname,
46  const gd::String &description,
47  const gd::String &sentence,
48  const gd::String &group,
49  const gd::String &icon,
50  const gd::String &smallIcon);
51 
57 
58  virtual ~InstructionMetadata(){};
59 
60  const gd::String &GetFullName() const { return fullname; }
61  const gd::String &GetDescription() const { return description; }
62  const gd::String &GetSentence() const { return sentence; }
63  const gd::String &GetGroup() const { return group; }
64  ParameterMetadata &GetParameter(size_t i) { return parameters[i]; }
65  const ParameterMetadata &GetParameter(size_t i) const {
66  return parameters[i];
67  }
68  size_t GetParametersCount() const { return parameters.size(); }
69  const std::vector<ParameterMetadata> &GetParameters() const {
70  return parameters;
71  }
72  const gd::String &GetIconFilename() const { return iconFilename; }
73  const gd::String &GetSmallIconFilename() const { return smallIconFilename; }
74  bool CanHaveSubInstructions() const { return canHaveSubInstructions; }
75 
80  const gd::String &GetHelpPath() const { return helpPath; }
81 
87  helpPath = path;
88  return *this;
89  }
90 
95  bool IsPrivate() const { return isPrivate; }
96 
102  isPrivate = true;
103  return *this;
104  }
105 
110  return relevantContext == "Any" || relevantContext == "Layout";
111  }
112 
117  return relevantContext == "Any" || relevantContext == "Function";
118  }
119 
124  return relevantContext == "Any" || relevantContext == "Function" ||
125  relevantContext == "AsynchronousFunction";
126  }
127 
132  return relevantContext == "Any" || relevantContext == "Object";
133  }
134 
139  relevantContext = "Layout";
140  return *this;
141  }
142 
147  relevantContext = "Function";
148  return *this;
149  }
150 
155  relevantContext = "AsynchronousFunction";
156  return *this;
157  }
158 
163  relevantContext = "Object";
164  return *this;
165  }
166 
172  bool IsAsync() const {
173  return !codeExtraInformation.asyncFunctionCallName.empty();
174  }
175 
180  bool IsOptionallyAsync() const {
181  return IsAsync() && !codeExtraInformation.functionCallName.empty();
182  }
183 
188  canHaveSubInstructions = true;
189  return *this;
190  }
191 
198  hidden = true;
199  return *this;
200  }
201 
206  group = str;
207  return *this;
208  }
209 
213  bool IsHidden() const { return hidden; }
214 
232  InstructionMetadata &AddParameter(
233  const gd::String &type,
234  const gd::String &label,
235  const gd::String &supplementaryInformation = "",
236  bool parameterIsOptional = false) override;
237 
249  InstructionMetadata &AddCodeOnlyParameter(
250  const gd::String &type, const gd::String &supplementaryInformation) override;
251 
258  InstructionMetadata &SetDefaultValue(const gd::String &defaultValue_) override {
259  if (!parameters.empty()) parameters.back().SetDefaultValue(defaultValue_);
260  return *this;
261  };
262 
270  const gd::String &longDescription) override {
271  if (!parameters.empty())
272  parameters.back().SetLongDescription(longDescription);
273  return *this;
274  }
275 
284  if (!parameters.empty()) parameters.back().SetExtraInfo(extraInfo);
285  return *this;
286  }
287 
295  InstructionMetadata &UseStandardOperatorParameters(
296  const gd::String &type, const ParameterOptions &options);
297 
305  InstructionMetadata &UseStandardRelationalOperatorParameters(
306  const gd::String &type, const ParameterOptions &options);
307 
313  isObjectInstruction = true;
314  return *this;
315  }
316 
322  isBehaviorInstruction = true;
323  return *this;
324  }
325 
329  bool IsObjectInstruction() const { return isObjectInstruction; }
330 
334  bool IsBehaviorInstruction() const { return isBehaviorInstruction; }
335 
342  InstructionMetadata &SetRequiresBaseObjectCapability(
343  const gd::String &capability);
344 
350  return requiredBaseObjectCapability;
351  }
352 
357  usageComplexity = 2;
358  return *this;
359  }
360 
366  usageComplexity = 7;
367  return *this;
368  }
369 
374  usageComplexity = 9;
375  return *this;
376  }
377 
382  int GetUsageComplexity() const { return usageComplexity; }
383 
388  public:
389  enum AccessType { Reference, MutatorAndOrAccessor, Mutators };
390  ExtraInformation() : accessType(Reference), hasCustomCodeGenerator(false){};
391  virtual ~ExtraInformation(){};
392 
393  // TODO Move these attributes to InstructionMetadata.
394  gd::String functionCallName;
395  gd::String asyncFunctionCallName;
396  gd::String type;
397  AccessType accessType;
398  gd::String optionalAssociatedInstruction;
399  std::map<gd::String, gd::String> optionalMutators;
400  bool hasCustomCodeGenerator;
401  std::function<gd::String(Instruction &instruction,
402  gd::EventsCodeGenerator &codeGenerator,
404  customCodeGenerator;
405  std::vector<gd::String> includeFiles;
406  };
409 
414  InstructionMetadata &SetFunctionName(const gd::String &functionName_) override {
415  codeExtraInformation.functionCallName = functionName_;
416  return *this;
417  }
418 
428  codeExtraInformation.asyncFunctionCallName = functionName_;
429  return *this;
430  }
431 
436  return codeExtraInformation.functionCallName;
437  }
438 
445  return codeExtraInformation.asyncFunctionCallName;
446  }
447 
455  codeExtraInformation.type = type_;
456  return *this;
457  }
458 
483  codeExtraInformation.optionalAssociatedInstruction = getter;
484  codeExtraInformation.accessType = codeExtraInformation.MutatorAndOrAccessor;
485  return *this;
486  }
487 
488  InstructionMetadata &SetMutators(
489  const std::map<gd::String, gd::String> &mutators) {
490  codeExtraInformation.optionalMutators = mutators;
491  codeExtraInformation.accessType = codeExtraInformation.Mutators;
492  return *this;
493  }
494 
500  InstructionMetadata &SetIncludeFile(const gd::String &includeFile) override {
501  codeExtraInformation.includeFiles.clear();
502  codeExtraInformation.includeFiles.push_back(includeFile);
503  return *this;
504  }
505 
509  InstructionMetadata &AddIncludeFile(const gd::String &includeFile) override {
510  if (std::find(codeExtraInformation.includeFiles.begin(), codeExtraInformation.includeFiles.end(), includeFile) ==
511  codeExtraInformation.includeFiles.end())
512  codeExtraInformation.includeFiles.push_back(includeFile);
513 
514  return *this;
515  }
516 
520  const std::vector<gd::String> &GetIncludeFiles() const override {
521  return codeExtraInformation.includeFiles;
522  };
523 
524  InstructionMetadata &SetCustomCodeGenerator(
525  std::function<gd::String(Instruction &instruction,
526  gd::EventsCodeGenerator &codeGenerator,
528  codeGenerator) {
529  codeExtraInformation.hasCustomCodeGenerator = true;
530  codeExtraInformation.customCodeGenerator = codeGenerator;
531  return *this;
532  }
533 
534  InstructionMetadata &RemoveCustomCodeGenerator() {
535  codeExtraInformation.hasCustomCodeGenerator = false;
536  std::function<gd::String(Instruction & instruction,
537  gd::EventsCodeGenerator & codeGenerator,
539  emptyFunction;
540  codeExtraInformation.customCodeGenerator = emptyFunction;
541  return *this;
542  }
543 
544  bool HasCustomCodeGenerator() const { return codeExtraInformation.hasCustomCodeGenerator; }
545 
553 
554  std::vector<ParameterMetadata> parameters;
555 
556  private:
557  gd::String fullname;
558  gd::String description;
559  gd::String helpPath;
560  gd::String sentence;
561  gd::String group;
562  gd::String iconFilename;
563  gd::String smallIconFilename;
564  bool canHaveSubInstructions;
565  gd::String extensionNamespace;
566  bool hidden;
567  int usageComplexity;
569  bool isPrivate;
570  bool isObjectInstruction;
571  bool isBehaviorInstruction;
572  gd::String requiredBaseObjectCapability;
573  gd::String relevantContext;
574 };
575 
576 } // namespace gd
Describe user-friendly information about an expression or an instruction (action or condition),...
Definition: AbstractFunctionMetadata.h:36
Used to manage the context when generating code for events.
Definition: EventsCodeGenerationContext.h:27
Internal class used to generate code from events.
Definition: EventsCodeGenerator.h:40
An instruction is a member of an event: It can be a condition or an action.
Definition: Instruction.h:30
Defines information about how generate the code for an instruction.
Definition: InstructionMetadata.h:387
Describe user-friendly information about an instruction (action or condition), its parameters and the...
Definition: InstructionMetadata.h:38
bool IsOptionallyAsync() const
Definition: InstructionMetadata.h:180
InstructionMetadata & MarkAsComplex()
Consider that the instruction is complex for a user to understand.
Definition: InstructionMetadata.h:373
InstructionMetadata & SetIsBehaviorInstruction()
Mark the instruction as a behavior instruction. Automatically called when using AddAction/AddConditio...
Definition: InstructionMetadata.h:321
const gd::String & GetHelpPath() const
Definition: InstructionMetadata.h:80
InstructionMetadata & MarkAsSimple()
Consider that the instruction is easy for a user to understand.
Definition: InstructionMetadata.h:356
bool IsRelevantForCustomObjectEvents() const
Definition: InstructionMetadata.h:131
InstructionMetadata & SetDefaultValue(const gd::String &defaultValue_) override
Set the default value used in editor (or if an optional parameter is empty during code generation) fo...
Definition: InstructionMetadata.h:258
InstructionMetadata & SetRelevantForAsynchronousFunctionEventsOnly() override
Definition: InstructionMetadata.h:154
InstructionMetadata & SetAsyncFunctionName(const gd::String &functionName_)
Definition: InstructionMetadata.h:427
InstructionMetadata & SetHelpPath(const gd::String &path)
Definition: InstructionMetadata.h:86
bool IsPrivate() const
Definition: InstructionMetadata.h:95
InstructionMetadata & SetGetter(const gd::String &getter)
Definition: InstructionMetadata.h:482
bool IsRelevantForFunctionEvents() const
Definition: InstructionMetadata.h:116
bool IsRelevantForLayoutEvents() const
Definition: InstructionMetadata.h:109
InstructionMetadata & SetIncludeFile(const gd::String &includeFile) override
Erase any existing include file and add the specified include.
Definition: InstructionMetadata.h:500
InstructionMetadata & GetCodeExtraInformation()
Return the structure containing the information about code generation for the instruction.
Definition: InstructionMetadata.h:552
InstructionMetadata & SetRelevantForLayoutEventsOnly() override
Definition: InstructionMetadata.h:138
InstructionMetadata & SetPrivate() override
Definition: InstructionMetadata.h:101
InstructionMetadata & AddIncludeFile(const gd::String &includeFile) override
Add a file to the already existing include files.
Definition: InstructionMetadata.h:509
const std::vector< gd::String > & GetIncludeFiles() const override
Get the files that must be included to use the instruction.
Definition: InstructionMetadata.h:520
InstructionMetadata & SetParameterExtraInfo(const gd::String &extraInfo) override
Set the additional information, used for some parameters with special type (for example,...
Definition: InstructionMetadata.h:283
InstructionMetadata & SetGroup(const gd::String &str)
Set the group of the instruction in the IDE.
Definition: InstructionMetadata.h:205
bool IsRelevantForAsynchronousFunctionEvents() const
Definition: InstructionMetadata.h:123
InstructionMetadata & SetRelevantForFunctionEventsOnly() override
Definition: InstructionMetadata.h:146
bool IsObjectInstruction() const
Check if the instruction is an object instruction.
Definition: InstructionMetadata.h:329
InstructionMetadata & SetParameterLongDescription(const gd::String &longDescription) override
Set the long description shown in the editor for the last added parameter.
Definition: InstructionMetadata.h:269
int GetUsageComplexity() const
Return the usage complexity of this instruction for the user, from 0 (simple&easy to use) to 10 (comp...
Definition: InstructionMetadata.h:382
InstructionMetadata & SetCanHaveSubInstructions()
Definition: InstructionMetadata.h:187
InstructionMetadata & SetManipulatedType(const gd::String &type_)
Declare if the instruction being declared is somewhat manipulating in a standard way.
Definition: InstructionMetadata.h:454
ExtraInformation codeExtraInformation
Definition: InstructionMetadata.h:407
InstructionMetadata & SetFunctionName(const gd::String &functionName_) override
Definition: InstructionMetadata.h:414
const gd::String & GetAsyncFunctionName()
Definition: InstructionMetadata.h:444
InstructionMetadata & SetRelevantForCustomObjectEventsOnly() override
Definition: InstructionMetadata.h:162
bool IsHidden() const
Return true if the instruction must be hidden in the IDE.
Definition: InstructionMetadata.h:213
InstructionMetadata & MarkAsAdvanced()
Consider that the instruction is harder for a user to understand than a normal instruction.
Definition: InstructionMetadata.h:365
bool IsBehaviorInstruction() const
Check if the instruction is a behavior instruction.
Definition: InstructionMetadata.h:334
bool IsAsync() const
Definition: InstructionMetadata.h:172
const gd::String & GetRequiredBaseObjectCapability() const
Get the required specified capability for this (object) instruction, or an empty string if there is n...
Definition: InstructionMetadata.h:349
InstructionMetadata & SetHidden() override
Set the instruction to be hidden in the IDE.
Definition: InstructionMetadata.h:197
InstructionMetadata & SetIsObjectInstruction()
Mark the instruction as an object instruction. Automatically called when using AddAction/AddCondition...
Definition: InstructionMetadata.h:312
const gd::String & GetFunctionName()
Definition: InstructionMetadata.h:435
Describe a parameter of an instruction (action, condition) or of an expression: type,...
Definition: ParameterMetadata.h:27
String represents an UTF8 encoded string.
Definition: String.h:31
Definition: CommonTools.h:24
Definition: ParameterOptions.h:15