Skip to content

Commit 6f276de

Browse files
committed
Don't check the unsupported operator= for symbols
Signed-off-by: Dimitar Dobrev <[email protected]>
1 parent b4cece4 commit 6f276de

File tree

5 files changed

+184
-151
lines changed

5 files changed

+184
-151
lines changed

src/Generator.Tests/Passes/TestPasses.cs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -186,21 +186,17 @@ public void TestCheckAmbiguousFunctionsPass()
186186
Assert.IsNotNull(@class);
187187
var overloads = @class.Methods.Where(m => m.Name == "Method");
188188
var constMethod = overloads
189-
.Where(m => m.IsConst && m.Parameters.Count == 0)
190-
.FirstOrDefault();
189+
.FirstOrDefault(m => m.IsConst && m.Parameters.Count == 0);
191190
var nonConstMethod = overloads
192-
.Where(m => !m.IsConst && m.Parameters.Count == 0)
193-
.FirstOrDefault();
191+
.FirstOrDefault(m => !m.IsConst && m.Parameters.Count == 0);
194192
Assert.IsNotNull(constMethod);
195193
Assert.IsNotNull(nonConstMethod);
196194
Assert.IsTrue(constMethod.GenerationKind == GenerationKind.None);
197195
Assert.IsTrue(nonConstMethod.GenerationKind == GenerationKind.Generate);
198196
var constMethodWithParam = overloads
199-
.Where(m => m.IsConst && m.Parameters.Count == 1)
200-
.FirstOrDefault();
197+
.FirstOrDefault(m => m.IsConst && m.Parameters.Count == 1);
201198
var nonConstMethodWithParam = overloads
202-
.Where(m => !m.IsConst && m.Parameters.Count == 1)
203-
.FirstOrDefault();
199+
.FirstOrDefault(m => !m.IsConst && m.Parameters.Count == 1);
204200
Assert.IsNotNull(constMethodWithParam);
205201
Assert.IsNotNull(nonConstMethodWithParam);
206202
Assert.IsTrue(constMethodWithParam.GenerationKind == GenerationKind.None);
@@ -226,7 +222,7 @@ private string TypePrinterDelegate(Type type)
226222
[Test]
227223
public void TestAbstractOperator()
228224
{
229-
passBuilder.AddPass(new CheckOperatorsOverloadsPass());
225+
passBuilder.AddPass(new ValidateOperatorsPass());
230226
passBuilder.RunPasses(pass => pass.VisitASTContext(AstContext));
231227

232228
var @class = AstContext.FindDecl<Class>("ClassWithAbstractOperator").First();
@@ -246,7 +242,7 @@ public void TestFlattenAnonymousTypesToFields()
246242
Assert.IsNotNull(@public);
247243
Assert.AreEqual(AccessSpecifier.Public, @public.Access); */
248244

249-
var @protected = @class.Fields.Where(f => f.Name == "Protected").FirstOrDefault();
245+
var @protected = @class.Fields.Find(f => f.Name == "Protected");
250246
Assert.IsNotNull(@protected);
251247
Assert.AreEqual(AccessSpecifier.Protected, @protected.Access);
252248
}

src/Generator/Driver.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -223,17 +223,18 @@ public void SetupPasses(ILibrary library)
223223
TranslationUnitPasses.AddPass(new CheckIgnoredDeclsPass());
224224
}
225225

226+
if (Options.IsCLIGenerator || Options.IsCSharpGenerator)
227+
{
228+
TranslationUnitPasses.AddPass(new MoveFunctionToClassPass());
229+
TranslationUnitPasses.AddPass(new ValidateOperatorsPass());
230+
}
231+
226232
library.SetupPasses(this);
227233

228234
TranslationUnitPasses.AddPass(new FindSymbolsPass());
229235
TranslationUnitPasses.AddPass(new CheckMacroPass());
230236
TranslationUnitPasses.AddPass(new CheckStaticClass());
231237

232-
if (Options.IsCLIGenerator || Options.IsCSharpGenerator)
233-
{
234-
TranslationUnitPasses.AddPass(new MoveFunctionToClassPass());
235-
}
236-
237238
TranslationUnitPasses.AddPass(new CheckAmbiguousFunctions());
238239
TranslationUnitPasses.AddPass(new ConstructorToConversionOperatorPass());
239240
TranslationUnitPasses.AddPass(new MarshalPrimitivePointersAsRefTypePass());

src/Generator/Passes/CheckDuplicatedNamesPass.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -189,13 +189,7 @@ public int GetHashCode(TemplateArgument obj)
189189

190190
public class CheckDuplicatedNamesPass : TranslationUnitPass
191191
{
192-
private readonly IDictionary<string, DeclarationName> names;
193-
194-
public CheckDuplicatedNamesPass()
195-
{
196-
ClearVisitedDeclarations = false;
197-
names = new Dictionary<string, DeclarationName>();
198-
}
192+
private readonly IDictionary<string, DeclarationName> names = new Dictionary<string, DeclarationName>();
199193

200194
public override bool VisitASTContext(ASTContext context)
201195
{

src/Generator/Passes/CheckOperatorsOverloads.cs

Lines changed: 15 additions & 129 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,24 @@ namespace CppSharp.Passes
1010
/// </summary>
1111
public class CheckOperatorsOverloadsPass : TranslationUnitPass
1212
{
13-
public CheckOperatorsOverloadsPass()
14-
{
15-
ClearVisitedDeclarations = false;
16-
}
13+
public CheckOperatorsOverloadsPass() =>
14+
VisitOptions.VisitClassBases =
15+
VisitOptions.VisitClassFields =
16+
VisitOptions.VisitEventParameters =
17+
VisitOptions.VisitFunctionParameters =
18+
VisitOptions.VisitFunctionReturnType =
19+
VisitOptions.VisitClassMethods =
20+
VisitOptions.VisitNamespaceEnums =
21+
VisitOptions.VisitNamespaceEvents =
22+
VisitOptions.VisitNamespaceTemplates =
23+
VisitOptions.VisitNamespaceTypedefs =
24+
VisitOptions.VisitNamespaceVariables =
25+
VisitOptions.VisitPropertyAccessors =
26+
VisitOptions.VisitTemplateArguments = false;
1727

1828
public override bool VisitClassDecl(Class @class)
1929
{
20-
if (@class.CompleteDeclaration != null)
21-
return VisitClassDecl(@class.CompleteDeclaration as Class);
22-
23-
if (!VisitDeclarationContext(@class))
30+
if (!base.VisitClassDecl(@class))
2431
return false;
2532

2633
// Check for C++ operators that cannot be represented in .NET.
@@ -49,14 +56,6 @@ private void CheckInvalidOperators(Class @class)
4956
{
5057
foreach (var @operator in @class.Operators.Where(o => o.IsGenerated))
5158
{
52-
if (!IsValidOperatorOverload(@operator) || @operator.IsPure)
53-
{
54-
Diagnostics.Debug("Invalid operator overload {0}::{1}",
55-
@class.OriginalName, @operator.OperatorKind);
56-
@operator.ExplicitlyIgnore();
57-
continue;
58-
}
59-
6059
if (@operator.IsNonMemberOperator)
6160
continue;
6261

@@ -184,118 +183,5 @@ static CXXOperatorKind CheckMissingOperatorOverloadPair(Class @class, out int in
184183
index = 0;
185184
return CXXOperatorKind.None;
186185
}
187-
188-
private bool IsValidOperatorOverload(Method @operator)
189-
{
190-
// These follow the order described in MSDN (Overloadable Operators).
191-
192-
switch (@operator.OperatorKind)
193-
{
194-
// These unary operators can be overloaded
195-
case CXXOperatorKind.Plus:
196-
case CXXOperatorKind.Minus:
197-
case CXXOperatorKind.Exclaim:
198-
case CXXOperatorKind.Tilde:
199-
200-
// These binary operators can be overloaded
201-
case CXXOperatorKind.Slash:
202-
case CXXOperatorKind.Percent:
203-
case CXXOperatorKind.Amp:
204-
case CXXOperatorKind.Pipe:
205-
case CXXOperatorKind.Caret:
206-
207-
// The array indexing operator can be overloaded
208-
case CXXOperatorKind.Subscript:
209-
210-
// The conversion operators can be overloaded
211-
case CXXOperatorKind.Conversion:
212-
case CXXOperatorKind.ExplicitConversion:
213-
return true;
214-
215-
// The comparison operators can be overloaded if their return type is bool
216-
case CXXOperatorKind.EqualEqual:
217-
case CXXOperatorKind.ExclaimEqual:
218-
case CXXOperatorKind.Less:
219-
case CXXOperatorKind.Greater:
220-
case CXXOperatorKind.LessEqual:
221-
case CXXOperatorKind.GreaterEqual:
222-
return @operator.ReturnType.Type.IsPrimitiveType(PrimitiveType.Bool);
223-
224-
// Only prefix operators can be overloaded
225-
case CXXOperatorKind.PlusPlus:
226-
case CXXOperatorKind.MinusMinus:
227-
Class @class;
228-
var returnType = @operator.OriginalReturnType.Type.Desugar();
229-
returnType = (returnType.GetFinalPointee() ?? returnType).Desugar();
230-
return returnType.TryGetClass(out @class) &&
231-
@class.GetNonIgnoredRootBase() ==
232-
((Class) @operator.Namespace).GetNonIgnoredRootBase() &&
233-
@operator.Parameters.Count == 0;
234-
235-
// Bitwise shift operators can only be overloaded if the second parameter is int
236-
case CXXOperatorKind.LessLess:
237-
case CXXOperatorKind.GreaterGreater:
238-
{
239-
Parameter parameter = @operator.Parameters.Last();
240-
Type type = parameter.Type.Desugar();
241-
switch (Options.GeneratorKind)
242-
{
243-
case GeneratorKind.CLI:
244-
return type.IsPrimitiveType(PrimitiveType.Int);
245-
case GeneratorKind.CSharp:
246-
Types.TypeMap typeMap;
247-
if (Context.TypeMaps.FindTypeMap(type, out typeMap))
248-
{
249-
var mappedTo = typeMap.CSharpSignatureType(
250-
new TypePrinterContext
251-
{
252-
Parameter = parameter,
253-
Type = type
254-
});
255-
var cilType = mappedTo as CILType;
256-
if (cilType?.Type == typeof(int))
257-
return true;
258-
}
259-
break;
260-
}
261-
return false;
262-
}
263-
264-
// No parameters means the dereference operator - cannot be overloaded
265-
case CXXOperatorKind.Star:
266-
return @operator.Parameters.Count > 0;
267-
268-
// Assignment operators cannot be overloaded
269-
case CXXOperatorKind.PlusEqual:
270-
case CXXOperatorKind.MinusEqual:
271-
case CXXOperatorKind.StarEqual:
272-
case CXXOperatorKind.SlashEqual:
273-
case CXXOperatorKind.PercentEqual:
274-
case CXXOperatorKind.AmpEqual:
275-
case CXXOperatorKind.PipeEqual:
276-
case CXXOperatorKind.CaretEqual:
277-
case CXXOperatorKind.LessLessEqual:
278-
case CXXOperatorKind.GreaterGreaterEqual:
279-
280-
// The conditional logical operators cannot be overloaded
281-
case CXXOperatorKind.AmpAmp:
282-
case CXXOperatorKind.PipePipe:
283-
284-
// These operators cannot be overloaded.
285-
case CXXOperatorKind.Equal:
286-
case CXXOperatorKind.Comma:
287-
case CXXOperatorKind.ArrowStar:
288-
case CXXOperatorKind.Arrow:
289-
case CXXOperatorKind.Call:
290-
case CXXOperatorKind.Conditional:
291-
case CXXOperatorKind.Coawait:
292-
case CXXOperatorKind.New:
293-
case CXXOperatorKind.Delete:
294-
case CXXOperatorKind.Array_New:
295-
case CXXOperatorKind.Array_Delete:
296-
default:
297-
return false;
298-
}
299-
}
300186
}
301187
}

0 commit comments

Comments
 (0)