private string CreateCodeBlock(MethodDeclarationSyntax node) { return node.HasAttribute<ShowBodyOnSlideAttribute>() ? node.Body.Statements.ToFullString().RemoveCommonNesting() : node.WithoutAttributes().ToPrettyString(); }
public override SyntaxNode VisitMethodDeclaration(MethodDeclarationSyntax node) { var newMethod = VisitMemberDeclaration(node, base.VisitMethodDeclaration(node)); if (node.HasAttribute<ExpectedOutputAttribute>()) { ExerciseClassName = ExerciseClassName ?? FindParentClassName(node); Exercise.ExpectedOutput = node.GetAttributes<ExpectedOutputAttribute>().Select(attr => attr.GetArgument(0)).FirstOrDefault(); } if (node.HasAttribute<HideExpectedOutputOnErrorAttribute>()) Exercise.HideExpectedOutputOnError = true; if (node.HasAttribute<HintAttribute>()) Exercise.HintsMd.AddRange(node.GetAttributes<HintAttribute>().Select(attr => attr.GetArgument(0))); if (node.HasAttribute<CommentAfterExerciseIsSolved>()) Exercise.CommentAfterExerciseIsSolved = node.GetAttributes<CommentAfterExerciseIsSolved>().Single().GetArgument(0); if (node.HasAttribute<ExerciseAttribute>()) { ExerciseClassName = ExerciseClassName ?? FindParentClassName(node); Exercise.EthalonSolution += node.WithoutAttributes(); Exercise.ExerciseInitialCode = GetExerciseCode(node); if (node.HasAttribute<SingleStatementMethodAttribute>()) Exercise.ValidatorName += " SingleStatementMethod"; } return newMethod; }
/// <summary> /// Normalizes the <paramref name="methodDeclaration" /> and adds the generated members. /// </summary> /// <param name="methodDeclaration">The method declaration that should be normalized.</param> private MethodDeclarationSyntax NormalizeExternMethod(MethodDeclarationSyntax methodDeclaration) { var originalDeclaration = methodDeclaration; var methodDelegate = CreateDelegate(methodDeclaration); var methodField = CreateField(methodDelegate); // Add the [Required] attribute if it is not already present if (!methodDeclaration.HasAttribute<RequiredAttribute>(SemanticModel)) { methodDeclaration = methodDeclaration.RemoveTrivia(); methodDeclaration = methodDeclaration.WithAttributeLists(methodDeclaration.AttributeLists.Add(_requiredAttribute.WithTrailingSpace())); } // Remove the 'extern' keyword from the method var externIndex = methodDeclaration.Modifiers.IndexOf(SyntaxKind.ExternKeyword); methodDeclaration = methodDeclaration.WithModifiers(methodDeclaration.Modifiers.RemoveAt(externIndex)); // Add the [DebuggerHidden] attribute if it is not already present if (!originalDeclaration.HasAttribute<DebuggerHiddenAttribute>(SemanticModel)) methodDeclaration = methodDeclaration.WithAttributeLists(methodDeclaration.AttributeLists.Add(_debuggerHiddenAttribute)); // Replace the method's body and ensure that we don't modify the line count of the containing type methodDeclaration = AddBackingFieldAttribute(methodDeclaration); methodDeclaration = ReplaceBodyWithDelegateInvocation(methodDeclaration); methodDeclaration = methodDeclaration.NormalizeWhitespace(); methodDeclaration = methodDeclaration.WithTrivia(originalDeclaration); ++_portCount; AddMembers(originalDeclaration.GetMethodSymbol(SemanticModel).ContainingType, methodField, methodDelegate); return methodDeclaration.EnsureLineCount(originalDeclaration); }