dotnet / dotnet/fsharp

Support 'protected abstract'

Open
#12,281 2 comments 0 reactions 0 assignees View on GitHub
Area-Compiler-ImportAndInterop Bug Impact-Low
Dominant language
F#
Stars
4.3k
Forks
876
Avg merge
4d 11h
Merged PRs (30d)
131

Description

**Repro steps**

1. Create new fsharp project
2. Add "MarkdigExtensions.SyntaxHighlighting" package
3. Add the following code
```f#
open Markdig.Renderers
open Markdig.Renderers.Html
open Markdig.Syntax
open MarkdigExtensions.SyntaxHighlighting

type SyntaxHighlightingRendererWrapper() =
inherit CodeBlockRenderer() with
let highlightingRenderer = HighlightedCodeBlockRenderer()

override _.Write(renderer: HtmlRenderer, codeBlock: CodeBlock): unit =
highlightingRenderer.Write(renderer, codeBlock)
```

ZIP archive of the reproduction:
[Repro_fsharp_accessibility.zip](https://github.com/dotnet/fsharp/files/7375873/Repro_fsharp_accessibility.zip)

**Expected behavior**

No compilation errors

**Actual behavior**

Error
```
Program.fs(12, 13): [FS0629] Method 'Write' is not accessible from this code location
```

**Known workarounds**

Extract Write method into a function:
```f#
open Markdig.Renderers
open Markdig.Renderers.Html
open Markdig.Syntax
open MarkdigExtensions.SyntaxHighlighting

let render (highlightingRenderer: HighlightedCodeBlockRenderer) (renderer: HtmlRenderer) (codeBlock: CodeBlock) =
highlightingRenderer.Write(renderer, codeBlock)

type SyntaxHighlightingRendererWrapper() =
inherit CodeBlockRenderer() with
let highlightingRenderer = HighlightedCodeBlockRenderer()

override _.Write(renderer: HtmlRenderer, codeBlock: CodeBlock): unit =
render highlightingRenderer renderer codeBlock
```

**Related information**

* Win11
* .NET 6 (SDK version=6.0.100-rc.2.21505.57)
* Building via dotnet CLI (dotnet build)

---

I can only guess that this has something to do with overload resolution.
Type `HighlightedCodeBlockRenderer` inherits from `MarkdownObjectRenderer` that has a similar *protected* method:
```c#
protected abstract void Write(TRenderer renderer, TObject obj);
// TRenderer resolves into HtmlRenderer
// TObject resolves into CodeBlock
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.