70QmlPropertyArguments::parse(
const QString &str,
const Location &loc, ParsingOptions opts)
77 auto input{str.trimmed()};
78 QmlPropertyArguments args;
80 bool is_method = (opts & ParsingOptions::ParseAsMethod) != ParsingOptions::None;
82 auto paramStart = input.indexOf(
'('_L1);
83 if (paramStart != -1) {
84 if (
auto paramEnd = input.indexOf(
')'_L1, ++paramStart); paramEnd != -1)
85 args.m_params = input.sliced(paramStart, paramEnd - paramStart).trimmed();
86 input.resize(paramStart - 1);
87 input = input.trimmed();
89 if (is_method && args.m_params.isNull()) {
90 loc.warning(
"Invalid syntax for \\qmlmethod: %1"_L1.arg(str));
94 auto offset = input.indexOf(
' '_L1);
96 if ((opts & ParsingOptions::IgnoreType) == ParsingOptions::None) {
97 loc.warning(
"Missing %1 type for %2"_L1
98 .arg(is_method ?
"return"_L1 :
"property"_L1, str));
102 args.m_type = input.first(offset);
103 if ((args.m_isList = args.m_type.startsWith(
"list<"_L1)) && !is_method)
104 args.m_type.slice(5).chop(1);
107 auto segments = input.slice(++offset).split(
"::"_L1);
108 if (segments.size() > 3 || (segments.size() == 1 &&
109 (opts & ParsingOptions::RequireQualifiedPath) != ParsingOptions::None)) {
110 loc.warning(
"Unrecognizable QML module/type qualifier for %1"_L1.arg(str));
113 args.m_name = segments.takeLast();
114 if (segments.size() > 0)
115 args.m_qmltype = segments.takeLast();
116 if (segments.size() > 0)
117 args.m_module = segments[0];
119 return std::optional(args);